标签:struct void 保存 交换 if语句 while 编译 ++ lib
嗯,,这是自己写的第一篇博客哈,写的不好大家不要见怪,主要是想把自己的一些思想分享给大家。也欢迎大家指出错误,一同进步。
话不多说,直接先说想法。要把一个单链表逆置,可以大致分为下列几步。先创建一个链表。然后要考虑到链表的逆置实现。最后是链表的输出。有了这样过几步大概的想法之后,我们便要来一步步的实现啦。嗯,,创建链表就不说了,大家都会。 然后呢就是链表的逆置,这里我是采用的就地逆置法,,嗯,反正我是这么叫的,大家可以参考一下。当然啦,你得考虑到函数的形参和返回值以及指针的交接,这里如果出了问题,编译器是不会报错的,所以大家务必多加注意。其余的小问题还是看代码吧。
额,,之前画的草图不见了,,现在也没有办法给大家画个草图演示一下,很抱歉啊。如果大家看不懂链表逆置可以画个草图自己看看,应该就差不多了
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 }
标签:struct void 保存 交换 if语句 while 编译 ++ lib
原文地址:https://www.cnblogs.com/pasifar-31/p/9112805.html