為了方便解釋,將鏈表長度設為了5。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 //鏈表定義 5 typedef struct node{ 6 int data; 7 struct node *next; 8 }link; 9 10 //構造鏈表 11 link * create_link(link *head) 12 { 13 int data[5]; 14 int i=0; 15 while(i<5) 16 { 17 scanf("%d",&data[i]); 18 i++; 19 } 20 link *p=head;//p為每次鏈表更新后的最后一個節點 21 for (i=0;i<5;i++) 22 { 23 link *q=(link*)malloc(sizeof(link)); 24 q->data=data[i]; 25 q->next=NULL; 26 p->next=q; 27 p=q; 28 } 29 return head; 30 } 31 32 //鏈表反向 33 link * reserve_link(link *head) 34 { 35 link *last=head->next;//last為鏈表最后一個節點,反向后為第一個節點 36 int num=1; 37 while (last->next!=NULL) 38 { 39 num++; 40 last=last->next; 41 } 42 link *p,*q;//p為鏈表更新后反向那端開始的最后一個節點 43 p=last; 44 int i; 45 for (i=num-1;i>=1;i--) 46 { 47 int j=1; 48 q=head->next; 49 while (j<i)//找出原向的第i各節點p 50 { 51 q=q->next; 52 j++; 53 } 54 p->next=q; 55 q->next=NULL;//此時節點q的next域是空,不加此句最后的兩個節點會成環 56 p=q; 57 } 58 head->next=last; 59 return head; 60 } 61 62 int main() 63 { 64 link *head=(link*)malloc(sizeof(link)); 65 head->data=0; 66 head->next=NULL; 67 68 link *li=create_link(head); 69 70 link *relink=reserve_link(head); 71 72 return 0; 73 }
聲明測試環境是vc6.0,在70行和72行分別加兩個斷點,測試結果如下:
原先鏈表:
反向后的鏈表: