C语言单链表逆置的代码实现 (简单易懂版)

  嗯,,这是自己写的第一篇博客哈,写的不好大家不要见怪,主要是想把自己的一些思想分享给大家。也欢迎大家指出错误,一同进步。

 

  话不多说,直接先说想法。要把一个单链表逆置,可以大致分为下列几步。先创建一个链表。然后要考虑到链表的逆置实现。最后是链表的输出。有了这样过几步大概的想法之后,我们便要来一步步的实现啦。嗯,,创建链表就不说了,大家都会。  然后呢就是链表的逆置,这里我是采用的就地逆置法,,嗯,反正我是这么叫的,大家可以参考一下。当然啦,你得考虑到函数的形参和返回值以及指针的交接,这里如果出了问题,编译器是不会报错的,所以大家务必多加注意。其余的小问题还是看代码吧。

 

  额,,之前画的草图不见了,,现在也没有办法给大家画个草图演示一下,很抱歉啊。如果大家看不懂链表逆置可以画个草图自己看看,应该就差不多了

  

 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 } 

 

 

猜你喜欢

转载自www.cnblogs.com/pasifar-31/p/9112805.html