/*创建一个链表,实现对链表的创建,插入/追加,删除等操作*/#includestdio.h#includestdlib.h#includemalloc.h//创建一个结构体typedefstructNode{intdata;structNode*pNext;}NODE,*PNODE;//函数前置声明PNODEcreate_list(void);//创建一个链表voidtraverse_list(PNODE);//遍历整个链表boolis_empty(PNODE);//判断列表是否为空intlength_list(PNODE);//返回链表的长度boolinsert_list(PNODE,int,int);//在链表中插入元素booldelete_list(PNODE,int,int*);//删除链表中的某个元素,并且返回被删除的元素的值。voidsort_list(PNODE);//对链表进行排序intmain(void){//初始化头指针变量PNODEpHead=NULL;intval;//创建一个链表,将头结点的指针返回,保存到头指针变量中pHead=create_list();//判断这个链表是否为空/*if(is_empty(pHead)){printf(这个链表为空\n);}else{printf(链表不为空\n);}*///查看元素的个数printf(该链表元素的个数为:%d\n,length_list(pHead));//遍历整个链表printf(遍历整个链表:);traverse_list(pHead);//插入元素printf(在第3个元素前插入一个99的值:);insert_list(pHead,3,99);traverse_list(pHead);//对链表进行排序printf(对链表进行升序排序:);sort_list(pHead);traverse_list(pHead);//删除链表中的元素printf(删除第三个位置的值:);delete_list(pHead,3,&val);//遍历这个链表traverse_list(pHead);return0;}/*常见一个链表@paramvoid@returnpHead头指针*/PNODEcreate_list(void){intval;//用于保存用户输入的值inti;//for循环自增变量intdata;//创建头结点PNODEpHead=(PNODE)malloc(sizeof(NODE));if(NULL==pHead){printf(动态内存创建失败\n);exit(-1);}PNODEpTail=pHead;pTail-pNext=NULL;printf(需要创建元素的个数len=);scanf(%d,&val);for(i=0;ival;++i){printf(请输入第%d个元素:,i+1);scanf(%d,&data);//创建这个节点PNODEpNew=(PNODE)malloc(sizeof(NODE));if(NULL==pNew){printf(动态内存创建失败\n);exit(-1);}pNew-data=data;pNew-pNext=NULL;pTail-pNext=pNew;pTail=pNew;}returnpHead;}/*遍历一个链表@paramPNODE头指针@returnvoid*/voidtraverse_list(PNODEpHead){PNODEp;p=pHead;if(is_empty(pHead)){printf(这个链表为空\n);return;}while(NULL!=p-pNext){p=p-pNext;printf(%d,p-data);}printf(\n);}/*判断链表是否为空@paramPNODEpHead头指针@returnbool*/boolis_empty(PNODEpHead){if(NULL==pHead-pNext){returntrue;}else{returnfalse;}}/*返回链表的长度@paramPNODEpHead头指针@returninti指针的长度*/intlength_list(PNODEpHead){PNODEp;inti=0;if(is_empty(pHead)){printf(链表为空。\n);}p=pHead-pNext;while(NULL!=p){++i;p=p-pNext;}returni;}/*对链表进行排序@paramPNODEpHead头指针@returnvoid思路:昨天对数组的排序方法,同样适用于链表,需要对for循环稍微改造一下。*/voidsort_list(PNODEpHead){inti,j,len,t;PNODEp,q;len=length_list(pHead);for(i=0,p=pHead-pNext;ilen-1;++i,p=p-pNext){for(j=i+1,q=p-pNext;jlen;++j,q=q-pNext){if(p-dataq-data){t=p-data;p-data=q-data;q-data=t;}}}}/*插入一个元素@paramPNODEpHead头指针@paramintpos插入元素的位置@paramintval要插入元素的值@returnbool*/boolinsert_list(PNODEpHead,intpos,intval){PNODEp=pHead;inti=0;/*目的:判断用户输入信息是否合法*/while(NULL!=p&&ipos-1){++i;p=p-pNext;}if(ipos-1||NULL==p){printf(您输入的值非法\n);returnfalse;}PNODEpNew=(PNODE)malloc(sizeof(NODE));if(NULL==pHead){printf(动态内存创建失败\n);exit(-1);}pNew-data=val;pNew-pNext=p-pNext;p-pNext=pNew;returntrue;}/*删除一个元素@paramPNODEpHead头指针@paramintpos删除元素的位置@paramPNODEval返回删除元素的值@returnbool*/booldelete_list(PNODEpHead,intpos,int*val){PNODEp=pHead;PNODEt;inti=0;while(NULL!=p-pNext&&ipos-1){++i;p=p-pNext;}/*这里的判断就需要是NULL==p-pNext,假如有5个元素,肯定不能删除第6个元素,因为第6个元素为空。只能删除第1个元素到第5个元素。*/if(ipos-1||NULL==p-pNext){printf(您输入的值非法\n);exit(-1);}t=p-pNext-pNext;*val=p-pNext-data;free(p-pNext);p-pNext=t;returntrue;}/*VC++6.0中的输出为:===========================================需要创建元素的个数len=5请输入第1个元素:1请输入第2个元素:2请输入第3个元素:3请输入第4个元素:4请输入第5个元素:5该链表元素的个数为:5遍历整个链表:12345在第3个元素前插入一个99的值:1299345对链表进行升序排序:1234599删除第三个位置的值:124599===========================================*/