C语言 数据结构链表的实例(十九种操作)
C语言数据结构链表的实例(十九种操作)
#include#include #include /*************************************************************************************/ /*第一版博主原文地址http://www.cnblogs.com/renyuan/archive/2013/05/21/3091506.html*/ /*第二版博主原文地址http://www.cnblogs.com/wireless-dragon/p/5170565.html*/ /*2.创建线性表,此函数输入不为正时终止读取数据*/ /*3.打印链表,链表的遍历*/ /*4.查询链表结点数并返回长度*/ /*5.检查单链表是否为空*/ /*6.将线性表进行冒泡排序*/ /*7.查找单链表中第n个结点中的元素*/ /*8.从单链表中查找具有给定值number的第一个元素,返回该结点的地址*/ /*9.把单链表中第n个结点的值修改为number的值*/ /*10.向单链表的表头插入一个元素*/ /*11.向单链表的末尾添加一个元素*/ /*12.向单链表中第n个结点位置插入元素为x的结点*/ /*13.向有序单链表中插入元素x结点,使得插入后仍然有序*/ /*14.从单链表中删除表头结点*/ /*15.从单链表中删除表尾结点*/ /*16.从单链表中删除第n个结点*/ /*17.从单链表中删除值为x的第一个结点*/ /*18.交换2个元素的位置*/ /*19.删除列表*/ /*************************************************************************************/ typedefintelemType; typedefstructNODE { elemTypeelement; structNODE*next; }Node; /*2.创建线性表,此函数输入不为正时终止读取数据*/ voidcreatList(Node**pHead) { printf("Pleaseenterthelist:\n"); Node*p1,*p2; p1=p2=(Node*)malloc(sizeof(Node)); if(p1==NULL||p2==NULL) exit(0); memset(p1,0,sizeof(Node)); scanf("%d",&p1->element); p1->next=NULL; while(p1->element>0) { if(*pHead==NULL) (*pHead)=p1; else p2->next=p1; p2=p1; p1=(Node*)malloc(sizeof(Node)); if(p1==NULL) exit(0); memset(p1,0,sizeof(Node)); scanf("%d",&p1->element); p1->next=NULL; } } /*3.打印链表,链表的遍历*/ voidprintList(Node*pHead) { if(NULL==pHead) printf("Thelistisempty\n"); else while(NULL!=pHead) { printf("%d",pHead->element); pHead=pHead->next; } printf("\n"); } /*4.查询链表结点数并返回长度*/ intsizeList(Node*pHead) { intsize=0; while(pHead!=NULL) { size++; pHead=pHead->next; } returnsize; } /*5.检查单链表是否为空*/ voidisEmptyList(Node*pHead) { if(pHead==NULL) { printf("Thelistisempty\n"); exit(0); } } /*7.查找单链表中第n个结点中的元素*/ voidgetElement(Node*pHead,intnum) { for(inti=1;i next; printf("Thevalueofthe%dthelementis:%d\n",num,pHead->element); } /*8.从单链表中查找具有给定值number的第一个元素,返回该结点的地址*/ intgetElemAddr(Node*pHead,intnumber) { inti=1; while(pHead!=NULL) { if(pHead->element==number) returni; i++; pHead=pHead->next; } return0; } /*9.把单链表中第n个结点的值修改为number的值*/ voidmodifyElem(Node**pList,intaddr,intnumber) { Node*pHead;//在此处如果直接更改pList指向的话,主函数中调用printList就会从addr处开始打印 inti=1; pHead=*pList; while(pHead!=NULL) { if(i==addr) break; pHead=pHead->next; i++; } pHead->element=number; } /*10.向单链表的表头插入一个元素*/ voidinsertHeadList(Node**pHead) { Node*p1; p1=(Node*)malloc(sizeof(Node)); if(p1==NULL) exit(0); memset(p1,0,sizeof(Node)); printf("Pleaseenteranumbertobeinserted:"); scanf("%d",&p1->element); p1->next=(*pHead);//此时pHead指向的是第一个结点(有数据域的),所以新的结点要插入到头结点前 (*pHead)=p1;//pHead指向第一个结点 } /*11.向单链表的末尾添加一个元素*/ voidinsertLastList(Node**pHead,intn) { Node*p1,*p2; p2=(*pHead); inti; for(i=1;i next; p1=(Node*)malloc(sizeof(Node)); if(p1==NULL) exit(0); memset(p1,0,sizeof(Node)); printf("Pleaseenteranumbertobeinserted:"); scanf("%d",&p1->element); p1->next=NULL; p2->next=p1; } /*12.向单链表中第n个结点位置插入元素为x的结点*/ voidisAddPos(Node**pHead,intlength) { Node*p1,*p2; intposition,i; printf("Pleaseentertheinsertposition:"); scanf("%d",&position); if(position>length||position<=0) { printf("Inputerror,theprogramends\n"); exit(0); } p1=(Node*)malloc(sizeof(Node)); p2=(*pHead); if(p1==NULL) exit(0); memset(p1,0,sizeof(Node)); printf("Pleaseenteranumbertobeinserted:"); scanf("%d",&p1->element); for(i=1;i next; p1->next=p2->next; p2->next=p1; } /*6.将线性表进行冒泡排序*/ voidArrange(Node**pHead,intlength) { Node*p1; p1=(*pHead); inti,j,temp; for(i=length;i>0;--i) { for(j=i-1;j>0;--j) { if((p1->element)>(p1->next->element)) { temp=p1->element; p1->element=p1->next->element; p1->next->element=temp; } p1=p1->next; } p1=(*pHead); } } intOrrderList(Node**pHead,intlength) { Node*p1,*p2; p1=(*pHead); p2=(Node*)malloc(sizeof(Node)); if(p2==NULL) exit(0); memset(p2,0,sizeof(Node)); printf("Enterthevalueoftheelementtobeinserted:"); scanf("%d",&p2->element); if(p2->element element) { p2->next=p1; (*pHead)=p2; return1; } while(p1->next!=NULL&&p2->element>(p1->next->element)) p1=p1->next; if(p1->next==NULL) { p2->next=NULL; p1->next=p2; return1; } else { p2->next=p1->next; p1->next=p2; return1; } } /*14.从单链表中删除表头结点*/ voidDelHeadList(Node**pHead) { Node*p1; p1=(*pHead); (*pHead)=(*pHead)->next; free(p1); } /*15.从单链表中删除表尾结点*/ voidDelLastList(Node**pHead) { Node*p1,*p2; p1=(*pHead); p2=p1->next; while(p2->next!=NULL) { p2=p2->next; p1=p1->next; } p1->next=NULL; free(p2); } /*16.从单链表中删除第n个结点*/ voidDelPos(Node**pHead,intlength) { intn,i; Node*p1,*p2; p1=(*pHead); p2=p1->next; printf("Pleaseentertheserialnumbernumbertodelete:"); scanf("%d",&n); if(n<1||n>length) exit(0); for(i=1;i next; p1=p1->next; } p1->next=p2->next; free(p2); } /*17.从单链表中删除值为x的第一个结点*/ intDelx(Node**pHead) { Node*p1,*p2; p1=(*pHead); p2=p1->next; intnumber; printf("Pleaseinputisgoingtobedeletedthevalueofx:"); scanf("%d",&number); if(number==(*pHead)->element) { (*pHead)=(*pHead)->next; free(p1); return1; } while(p2!=NULL) { if(p2->element==number) { break; } p2=p2->next; p1=p1->next; } if(p2==NULL) { printf("Xdoesnotexistinthelist\n"); return1; } else { p1->next=p2->next; free(p2); return1; } } /*18.交换2个元素的位置*/ voidexchange2pos(Node**pHead,intlength) { Node*p1,*p2; intn1,n2,i,j,temp; printf("Pleaseenterthefirstnumber:"); scanf("%d",&n1); printf("Pleaseenterthesecondnumber:"); scanf("%d",&n2); if(n1<1||n1>length||n2<1||n2>length) exit(0); p1=p2=(*pHead); for(i=1;i next; } for(j=1;j next; } temp=p1->element; p1->element=p2->element; p2->element=temp; } /*删除列表*/ voidclearList(Node**pHead) { Node*p1; p1=(*pHead); while(p1!=NULL) { p1=p1->next; free((*pHead)); (*pHead)=p1; } } intmain(intargc,charconst*argv[]) { /*1.初始化线性表,即置单链表的表头指针为空*/ Node*pList=NULL; intlength=0,n,addr,number; /*2.创建线性表,此函数输入不为正时终止读取数据*/ printf("---------2--------\n"); creatList(&pList); /*5.检查单链表是否为空*/ isEmptyList(pList); printList(pList); /*4.查询链表结点数并返回长度*/ printf("---------4--------\n"); length=sizeList(pList); printf("theNodelengthis:%d\n",length); /*7.查找单链表中第n个结点中的元素*/ printf("---------7--------\n"); printf("Pleaseinputnodenumber(n):"); scanf("%d",&n); if(n>length||n<1) { printf("Nisnotwithinthescopeof\n"); exit(0); } getElement(pList,n); /*8.从单链表中查找具有给定值number的第一个元素,返回该结点的地址*/ printf("---------8--------\n"); addr=0; number; printf("Pleaseentertofindelementvalue(number):"); scanf("%d",&number); addr=getElemAddr(pList,number); if(addr==0) printf("Listtheelement\n"); else printf("Thelocationofthenumberis:%d\n",addr); /*9.把单链表中第n个结点的值修改为number的值*/ printf("---------9--------\n"); addr=0; number=0; printf("Pleaseinputtoreplacetheserialnumber(n):"); scanf("%d",&addr); if(addr>length||addr<0) { printf("Nisnotwithinthescopeof\n"); exit(0); } printf("Pleaseinputtoreplacethecontentsofthe(number):"); scanf("%d",&number); modifyElem(&pList,addr,number); printf("Therevisedlistis:\n"); printList(pList); /*10.向单链表的表头插入一个元素*/ printf("---------10--------\n"); insertHeadList(&pList); printList(pList); /*11.向单链表的末尾添加一个元素*/ printf("---------11--------\n"); insertLastList(&pList,length); printList(pList); /*12.向单链表中第n个结点位置插入元素值为x的结点*/ printf("---------12--------\n"); isAddPos(&pList,length); printList(pList); /*6.将线性表进行冒泡排序*/ printf("---------6--------\n"); Arrange(&pList,length); printList(pList); /*13.向有序单链表中插入元素x结点,使得插入后仍然有序*/ printf("---------13--------\n"); OrrderList(&pList,length); printList(pList); /*14.从单链表中删除表头结点*/ printf("---------14--------\n"); DelHeadList(&pList); printList(pList); /*15.从单链表中删除表尾结点*/ printf("---------15--------\n"); DelLastList(&pList); printList(pList); /*16.从单链表中删除第n个结点*/ printf("---------16--------\n"); DelPos(&pList,length); printList(pList); /*17.从单链表中删除值为x的第一个结点*/ printf("---------17--------\n"); Delx(&pList); printList(pList); /*18.交换2个元素的位置*/ printf("---------18--------\n"); exchange2pos(&pList,length); printList(pList); /*19.删除列表*/ printf("---------19--------\n"); clearList(&pList); printList(pList); return0; }
以上就是C语言数据结构单链表的操作,所有基础操作都包含在内,很全面,本站对于数据结构的文章还很多,希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!