嗯,,這是自己寫的第一篇博客哈,寫的不好大家不要見怪,主要是想把自己的一些思想分享給大家。也歡迎大家指出錯誤,一同進步。
話不多說,直接先說想法。要把一個單鏈表逆置,可以大致分為下列幾步。先創建一個鏈表。然后要考慮到鏈表的逆置實現。最后是鏈表的輸出。有了這樣過幾步大概的想法之后,我們便要來一步步的實現啦。嗯,,創建鏈表就不說了,大家都會。 然后呢就是鏈表的逆置,這里我是采用的就地逆置法,,嗯,反正我是這么叫的,大家可以參考一下。當然啦,你得考慮到函數的形參和返回值以及指針的交接,這里如果出了問題,編譯器是不會報錯的,所以大家務必多加注意。其余的小問題還是看代碼吧。
額,,之前畫的草圖不見了,,現在也沒有辦法給大家畫個草圖演示一下,很抱歉啊。如果大家看不懂鏈表逆置可以畫個草圖自己看看,應該就差不多了
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct student 5 { 6 int data; 7 struct student *next; 8 }; 9 10 int iCount; //定義全局變量保存代碼長度 11 12 struct student *Create() 13 { 14 struct student *pHead = NULL; 15 struct student *pNew,*pEnd; 16 iCount = 0; 17 pEnd = pNew = (struct student*)malloc(sizeof(struct student)); 18 printf("請輸入數據:"); 19 scanf("%d",&pNew->data); 20 while(pNew->data!=0) 21 { 22 iCount++; 23 if(iCount == 1) //從本條if語句開始就要多注意指針的交接了哦,比較容易錯 24 { 25 pNew->next = NULL; 26 pEnd = pNew; 27 pHead = pNew; 28 } 29 else 30 { 31 pNew->next = NULL; 32 pEnd->next = pNew; 33 pEnd = pNew; 34 } 35 pNew = (struct student*)malloc(sizeof(struct student)); 36 printf("請輸入數據:"); 37 scanf("%d",&pNew->data); 38 } 39 free(pNew); 40 return pHead; 41 } 42 43 struct student *reverse(struct student *pHead) //鏈表逆置函數 44 { 45 struct student *p,*q,*t; //p為前置指針,q為后置指針,t為交換指針 46 q = pHead; 47 p = (q->next); 48 q->next = NULL; 49 while(t!=NULL) 50 { 51 t = p->next; 52 p->next = q; 53 q = p; 54 if(t!=NULL) p = t; 55 else; 56 } 57 return (p); 58 } 59 60 void showlist(struct student *pHead) //指針輸出函數 61 { 62 struct student *temp; 63 temp = pHead; 64 65 while(temp) 66 { 67 printf(" %d ",temp->data); 68 temp = temp->next; 69 } 70 printf("\n"); 71 } 72 73 int main() 74 { 75 struct student *first; 76 77 first = Create(); 78 printf("鏈表逆置前的數據:"); 79 showlist(first); 80 81 first = reverse(first); 82 83 printf("鏈表逆置后的數據:"); 84 showlist(first); 85 86 return 0; 87 }