1. 程式人生 > >尾插法建表後遞歸算法刪除表中元素

尾插法建表後遞歸算法刪除表中元素

truct 遞歸 繼續 div tlist 發現 屏蔽 因此 輸入

 1 #include<stdio.h>
 2 #include<stdlib.h> 
 3 typedef struct LNode{
 4      int data;
 5      struct LNode *next;
 6      
 7 }LNode,*Linklist;
 8 //尾插法創建單鏈表  
 9 Linklist CreatList(Linklist &L){
10     LNode *s,*r=L;//r為指向表尾的指針 
11     int x;
12     //L=(Linklist)malloc(sizeof(LNode));(此句王道書籍上代碼位置有錯,屏蔽) 
13 scanf("%d",&x); 14 while(x!=9999){//輸入9999退出 15 s=(LNode *)malloc(sizeof(LNode)); 16 s->data=x;//創建的新的結點s的data賦x值 17 r->next=s;//r作為指針它的下個結點指向了新創建的結點s 18 r=s; //可以理解成將r繼續作為尾指針(假裝代替了上一個s)繼續指向新的表尾結點 19 scanf("%d",&x); 20 } 21 r->next=NULL;//
尾結點指針置空 22 return L; 23 } 24 //遍歷輸出鏈表中的值 25 void Travel(Linklist &L){ 26 struct LNode *p=L->next; 27 if(p==NULL){ 28 printf("鏈表為空"); 29 }else{ 30 while(p!=NULL){ 31 printf("\np->data %d",p->data); 32 /*輸出刪除的結點的值, 33 由於下面調用了delete的固定值為5
34 (主函數裏調用Delete_one(L,5);) 35 所以運行結果是刪除所有結點值為5的結點 36 */ 37 p=p->next; 38 } 39 } 40 41 } 42 void Delete_one(Linklist &L,int x){ 43 LNode *p; //定義一個p結點指向刪除結點 44 if(L==NULL)//遞歸出口 45 return; 46 if(L->data==x){//如果L所指結點的值為x 47 p=L; //刪除*L結點,並讓L指向下一結點 48 L=L->next; 49 free(p); 50 Delete_one(L,x);//遞歸調用 51 printf("\n被刪除的結點是:%d",x); 52 return; 53 }else{ //如果L所指結點的值不是x 54 Delete_one(L->next,x);//進行下個結點的判斷 55 } 56 } 57 int main(){ 58 Linklist L; 59 L=(Linklist)malloc(sizeof(LNode)); 60 CreatList(L); 61 Delete_one(L,5);//刪除值為5的結點 62 Travel(L); 63 }

總結:對於王道數據結構2019版本中的一串代碼運行後,發現錯誤但是並不清楚錯在哪,後來爭論後知道原因在於重新申請的L內存空間而沒有對其進行操作的代碼,後面return的必然是個空,因此在主函數中增加L=(LinkList)malloc(sizeof(LNode)); 也可以在Create函數開始的地方添加,在對其進行操作。總結自身,過於依賴書上的代碼沒有自身理解後運行,這一點還是得感謝阿浩同學。

代碼註釋過多是為了便於後期復習,不要在意‘細節’。

so測試數據如下:

技術分享圖片

尾插法建表後遞歸算法刪除表中元素