鏈表的完整操作
第一次寫鏈表 #include #include #define K 20 //定義K為鏈表的最大長度? typedef struct lnode //此處一定要有結(jié)構(gòu)體名? { int number; struct lnode* pNext; //此處的成員名至關(guān)重要 ,即此處的stu? }*Link,Node; //同時(shí)應(yīng)該再定義node類型? //創(chuàng)建頭節(jié)點(diǎn)? Link CreateHead() { Link LinkHead=(Link)malloc(sizeof(Node));//此時(shí)sizeof后面應(yīng)該跟Node,而不是原先的Link? LinkHead->number=0; //應(yīng)該定義這個(gè)頭節(jié)點(diǎn)的數(shù)據(jù),這一行是原先無的,其實(shí)也可以不定義? LinkHead->pNext=NULL;? return LinkHead; } //頭插法初始化鏈表? Link HeadInitLink(Link HeadPtr,int length) { int i; printf("請逆序依次輸入值,輸入-1退出賦值\n"); Link ptemp=HeadPtr; //保存頭結(jié)點(diǎn)便于返回? for(i=0;inumber); //注意scanf都要加 & 這個(gè)符號? if(Ls->number==-1) //加入退出的條件? { break; }? //將新節(jié)點(diǎn)插入到鏈表頭部? Ls->pNext=ptemp->pNext; //此處應(yīng)該理解為將ptemp的next域空指針賦值給Ls的pNext域, //而不是之前理解的“指向”? ptemp->pNext=Ls; /?emp=Ls; //printf("%d\n",Ls->number); } printf("當(dāng)前鏈表長度為%d\n",i); //return HeadPtr; //return i;? } //尾插法初始化鏈表? Link TailInitLink(Link HeadPtr,int length) { int i; Link ptemp=(Link)malloc(sizeof(Link)); ptemp=HeadPtr; printf("請正序依次輸入值,輸入-1退出賦值\n"); for(i=0;inumber); if(Ln->number==-1) //加入退出的條件? { Ln->pNext=NULL; //將此處指針的next域置空? break; }? ptemp->pNext=Ln; Ln->pNext=NULL; ptemp=Ln; } printf("當(dāng)前鏈表長度為%d\n",i); //return HeadPtr; } //遍歷 void Display(Link HeadPtr)? { Link ptemp=HeadPtr->pNext; while(ptemp!=NULL) { printf("%d\n",ptemp->number); ptemp=ptemp->pNext; } } //查找與取值 LinkRetab(Link HeadPtr,int a) { Link ptemp=HeadPtr->pNext; int i; for(i=1;i<=K;i++) { if(ptemp->number==a||!ptemp) { printf("%d\n",ptemp->number); printf("查找的數(shù)據(jù)所在位置為%d\n",i);? break; } else { ptemp=ptemp->pNext; if(ptemp==NULL) { printf("未查找到數(shù)據(jù),您輸入的數(shù)據(jù)不在鏈表里\n"); } } } } //插入元素? void LinkInsert(Link HeadPtr,int place,int m) { Link newnode=(Link)malloc(sizeof(Node)); Link ptemp=HeadPtr; int i; newnode->number=m; for(i=1;i<=K;i++) { ptemp=ptemp->pNext; if(i==place) { newnode->pNext=ptemp->pNext; ptemp->pNext=newnode; break; } if(!ptemp){ break;} } } //刪除 //終于來到了最后一個(gè)函數(shù) void DeleteNode(Link HeadPtr,int place) { Link ptemp=HeadPtr; Link paft=ptemp->pNext; int i=0; while(paft!=NULL) { ptemp=ptemp->pNext; paft =paft ->pNext; i++;? if(i==place) { ptemp->pNext=paft->pNext; free(paft); paft=ptemp->pNext; } } ?}? int main() { int a,b,c,d,e; //使用函數(shù)創(chuàng)建頭節(jié)點(diǎn) Link NewHead=CreateHead(); //選擇頭插或尾插法創(chuàng)建鏈表?? printf("請選擇使用頭插法(輸入1)還是尾插法(輸入0)創(chuàng)建鏈表"); scanf("%d",&a); if(a==0) { TailInitLink(NewHead,K);} else if(a==1) { HeadInitLink(NewHead,K);} else { printf("輸入有誤\n"); return 1;} //遍歷單鏈表? Display(NewHead); //返回單鏈表的值和位置? printf("請輸入要返回的元素\n"); scanf("%d",&b); LinkRetab(NewHead,b); //在特定位置插入節(jié)點(diǎn)和值 printf("請輸入要插入元素的位置和要插入的值\n"); scanf("%d",&c); scanf("%d",&d); printf("重新遍歷\n"); LinkInsert(NewHead,c-1,d); Display(NewHead); //刪除節(jié)點(diǎn)和元素 printf("請輸入要?jiǎng)h除的節(jié)點(diǎn)\n"); scanf("%d",&e); DeleteNode(NewHead,e-1); printf("再次遍歷\n"); Display(NewHead); return 0; }