|
3.鏈表節(jié)點(diǎn)的插入 4.鏈表節(jié)點(diǎn)的刪除
3.鏈表節(jié)點(diǎn)的插入
解: ??? 1) 首先聲明一個(gè)新節(jié)點(diǎn)供輸入要插入節(jié)點(diǎn)的內(nèi)容 ??? 2) 由用戶輸入一個(gè)節(jié)點(diǎn)內(nèi)容(Key),表示欲插入在哪一個(gè)節(jié)點(diǎn)之后 ??? 3) 持續(xù)往下一個(gè)節(jié)點(diǎn),直到節(jié)點(diǎn)內(nèi)容Key或節(jié)點(diǎn)指針為NULL為止(即找不到該節(jié)點(diǎn)) ??? 4) 如果該節(jié)點(diǎn)不存在,則插入在節(jié)點(diǎn)前 ????????New->Next=Head ????????Head=New ??? 5) 如果找到該節(jié)點(diǎn),則 ??????? New->Next=Pointer->Next ??????? Pointer->Next=New *程序代碼如下: #include<stdlib.h> #include<stdio.h> #define Max 10 struct List??????????? /*節(jié)點(diǎn)結(jié)構(gòu)聲明*/ { ??? int Number; ??? int Total; ??? struct List *Next; }; typedef struct List Node; typedef Node *Link; int Data[2][Max]={1,3,5,7,2,4,6,8,9,0,15,35,10,67,25,65,38,70,30,20}; /*插入節(jié)點(diǎn)至鏈表內(nèi)*/ Link Insert_List(Link Head,Link New,int Key) { ??? Link Pointer;??????? /*聲明節(jié)點(diǎn)*/ ??? Pointer=Head;??????? /*Pointer指針設(shè)為首節(jié)點(diǎn)*/ ??? while(1) ??? { ??????? if(Pointer==NULL)??? /*插入在首節(jié)點(diǎn)前*/ ??????? { ??????????? New->Next=Head; ??????????? Head=New; ??????????? break; ??????? } ??????? if(Pointer->Number==Key)??? /*插入在鏈表中間或尾端*/ ??????? { ??????????? New->Next=Pointer->Next; ??????????? Pointer->Next=New; ??????????? break; ??????? } ??????? Pointer=Pointer->Next;??? /*指向下一個(gè)節(jié)點(diǎn)*/ ??? } ??? return Head; } /*輸出鏈表數(shù)據(jù)*/ void Print_List(Link Head) { ??? Link Pointer;??????? /*節(jié)點(diǎn)聲明*/ ??? Pointer=Head;??????? /*Pointer指針設(shè)為首節(jié)點(diǎn)*/ ??? while(Pointer!=NULL)????/*當(dāng)節(jié)點(diǎn)為NULL結(jié)束循環(huán)*/ ??? { ????????printf("[%d,%d]",Pointer->Number,Pointer->Total); ????????Pointer=Pointer->Next;????/*指向下一個(gè)節(jié)點(diǎn)*/ ??? } ??? printf("\n"); } /*釋放鏈表*/ void Free_List(Link Head) { ??? Link Pointer;??????? /*節(jié)點(diǎn)聲明*/ ??? while(Head!=NULL)??? /*當(dāng)節(jié)點(diǎn)為NULL結(jié)束循環(huán)*/ ??? { ??????? Pointer=Head; ??????? Head=Head->Next; ??????? free(Pointer); ??? } } /*建立鏈表*/ Link Create_List(Link Head) { ??? Link New;??????? /*節(jié)點(diǎn)聲明*/ ??? Link Pointer;??? /*節(jié)點(diǎn)聲明*/ ??? int i; ??? Head=(Link)malloc(sizeof(Node));??? /*分配內(nèi)存*/ ??? if(Head==NULL) ??????? printf("Memory allocate Failure!\n");??? /*內(nèi)存分配失敗*/ ??? else ??? { ??????? Head->Number=Data[0][0];??????? /*定義首節(jié)點(diǎn)數(shù)據(jù)編號(hào)*/ ??????? Head->Total=Data[1][0]; ??????? Head->Next=NULL; ??????? Pointer=Head;??????? /*Pointer指針設(shè)為首節(jié)點(diǎn)*/ ??????? for(i=1;i<Max;i++) ??????? { ??????????? New=(Link)malloc(sizeof(Node));??? /*分配內(nèi)存*/ ??????????? New->Number=Data[0][i]; ??????????? New->Total=Data[1][i]; ??????????? New->Next=NULL; ??????????? Pointer->Next=New;??????? /*將新節(jié)點(diǎn)串連在原列表尾端*/ ??????????? Pointer=New;??????????? /*列表尾端節(jié)點(diǎn)為新節(jié)點(diǎn)*/ ??????? } ??? } ??? return Head; } /*主程序*/ void main() { ??? Link Head;??????? /*節(jié)點(diǎn)聲明*/ ??? Link New; ??? int Key; ??? Head=Create_List(Head);??? /*建立鏈表*/ ??? if(Head!=NULL) ??? { ??????? Print_List(Head);???? ??????? while(1) ??????? { ??????????? printf("Input 0 to Exit\n");??? /*數(shù)據(jù)輸入提示*/ ??????????? New=(Link)malloc(sizeof(Node));??? /*分配內(nèi)存*/ ??????????? printf("Please input Data number:"); ??????????? scanf("%d",&New->Number); ??????????? if(New->Number==0)??????? /*輸入0時(shí)結(jié)束循環(huán)*/ ??????????????? break; ??????????? printf("Please input the data total:"); ??????????? scanf("%d",&New->Total); ??????????? printf("Please input the data number for Insert:"); ??????????? scanf("%d",&Key); ??????????? Head=Insert_List(Head,New,Key);??? /*插入節(jié)點(diǎn)*/ ??????????? Print_List(Head);??????????????? /*輸出鏈表數(shù)據(jù)*/ ??????? } ??????? Free_List(Head);??????? /*釋放鏈表*/ ??? } } *程序運(yùn)行結(jié)果如下:
 ------------------------------------------------------------------
4.鏈表節(jié)點(diǎn)的刪除 解: ??? 持續(xù)往下一個(gè)節(jié)點(diǎn)查找要?jiǎng)h除的節(jié)點(diǎn),直到節(jié)點(diǎn)內(nèi)容找到或節(jié)點(diǎn)指針為NULL(即找不到該節(jié)點(diǎn))。 ??? 在刪除時(shí),必須記錄前一個(gè)節(jié)點(diǎn)的位置(Back) ??? 如果該節(jié)點(diǎn)不存在,輸出一個(gè)節(jié)點(diǎn)不存在的提示 ??? 如果該節(jié)點(diǎn)存在,且是首節(jié)點(diǎn): ??????? Head=Pointer->Next ??????? free(Pointer) ??? 如果該節(jié)點(diǎn)存在,但不是首節(jié)點(diǎn)(即鏈表內(nèi)節(jié)點(diǎn)或尾端節(jié)點(diǎn)),則: ??????? Back->Next=Pointer->Next ??????? free(Pointer) *程序代碼如下: #include<stdio.h> #include<stdlib.h> #define Max 10 struct List????????????/*節(jié)點(diǎn)結(jié)構(gòu)聲明 */ { ????int Number; ????int Total; ????struct List *Next; }; typedef struct List Node; typedef Node *Link; int Data[2][Max]={1,3,5,7,2,4,6,8,9,10,15,35,10,67,25,65,38,70,30,20}; /*刪除鏈表內(nèi)節(jié)點(diǎn)*/ Link Delete_List(Link Head,int Key) { ????Link Pointer;????????/*節(jié)點(diǎn)聲明*/ ????Link Back; ????Pointer=Head;????????/*Pointer 指針設(shè)為首節(jié)點(diǎn)*/ ????while(1) ????{ ????????if(Pointer->Next==NULL) ????????{ ????????????printf("Not Found!\n"); ????????????break; ????????} ????????if(Head->Number==Key)????????/*刪除首節(jié)點(diǎn)*/ ????????{ ????????????Head=Pointer->Next; ????????????free(Pointer); ????????????break; ????????} ????????Back=Pointer; ????????Pointer=Pointer->Next;????/*指向下一個(gè)節(jié)點(diǎn)*/ ????????if(Pointer->Number==Key)????/*插入在鏈表中間或尾端*/ ????????{ ????????????Back->Next=Pointer->Next; ????????????free(Pointer); ????????????break; ????????} ????} ????return Head; } /*輸出鏈表數(shù)據(jù)*/ void Print_List(Link Head) { ????Link Pointer;????????/*節(jié)點(diǎn)聲明*/ ????Pointer=Head;????????/*Pointer指針設(shè)為首節(jié)點(diǎn)*/ ????while(Pointer!=NULL)????/*當(dāng)節(jié)點(diǎn)為NULL結(jié)束循環(huán)*/ ????{ ????????printf("[%d,%d]",Pointer->Number,Pointer->Total); ????????Pointer=Pointer->Next;????/*指向下一個(gè)節(jié)點(diǎn)*/ ????} ????printf("\n"); } /*釋放鏈表*/ void Free_List(Link Head) { ????Link Pointer;????????/*節(jié)點(diǎn)聲明*/ ????while(Head!=NULL)????/*當(dāng)節(jié)點(diǎn)為NULL結(jié)束循環(huán)*/ ????{ ????????Pointer=Head; ????????Head=Head->Next;????????/*指向下一個(gè)節(jié)點(diǎn)*/ ????????free(Pointer); ????} } /*建立鏈表*/ Link Create_List(Link Head) { ????Link New;????????/*節(jié)點(diǎn)聲明*/ ????Link Pointer; ????int i; ????Head=(Link)malloc(sizeof(Node));????????/*分本內(nèi)存*/ ????if(Head==NULL) ????????printf("Memory allocate Failure!\n");????/*內(nèi)存分配失敗*/ ????else ????{ ????????Head->Number=Data[0][0];????????/*定義首節(jié)點(diǎn)數(shù)據(jù)編號(hào)*/ ????????Head->Total=Data[1][0]; ????????Head->Next=NULL; ????????Pointer=Head;????????/*Pointer指針設(shè)為首節(jié)點(diǎn)*/ ????????for(i=1;i<Max;i++) ????????{ ????????????New=(Link)malloc(sizeof(Node));????????/*分配內(nèi)存*/ ????????????New->Number=Data[0][i]; ????????????New->Total=Data[1][i]; ????????????New->Next=NULL; ????????????Pointer->Next=New;????????/*將新節(jié)點(diǎn)串連在原列表尾端*/ ????????????Pointer=New;????????????/*列表尾端節(jié)點(diǎn)為新節(jié)點(diǎn)*/ ????????} ????} ????return Head; } /*主程序*/ void main() { ????Link Head=NULL;????????/*節(jié)點(diǎn)聲明*/ ????int Key; ????Head=Create_List(Head);????????/*建立鏈表*/ ????if(Head!=NULL) ????{ ????????Print_List(Head); ????????while(1) ????????{ ????????????printf("Input 0 to exit\n");????/*數(shù)據(jù)輸入提示*/ ????????????printf("Please input the data number for Delete:"); ????????????scanf("%d",&Key); ????????????if(Key==0)????????/*時(shí)結(jié)束循環(huán)*/ ????????????????break; ????????????Head=Delete_List(Head,Key);????/*刪除節(jié)點(diǎn)*/ ????????????Print_List(Head);????????????? /*輸出鏈表*/ ????????} ??????? Free_List(Head);????????/*釋放鏈表*/ ????} }
*程序運(yùn)行結(jié)果如下:
 ??
|
|