單鏈表的反向


為了方便解釋,將鏈表長度設為了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行分別加兩個斷點,測試結果如下:

原先鏈表:

反向后的鏈表:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM