反序排列一个单链表--C和指针,12.8.4

主要思路是:

1.计算链表的节点

2.从而为一个指针数组分配内存,每个元素都是一个指向节点的指针,例如 NODE * temp[3] = {NODE*p1,NODE*p2,NODE*p3};

3. 将每个结构赋给上述的指针

4.使当前结构内的指针成员,例如p3->fwd = p2, p2->fwd = p1 ....

 

 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 
 4 struct NODE {
 5         int value;
 6         struct NODE * fwd;
 7 }Node;
 8 struct NODE* sll_reverse(struct NODE* first);
 9 
10 int main()
11 {
12     NODE a, b, c;
13 c = { 15,NULL }; 14 b = { 10, &c }; 15 a = { 5, &b };
16 NODE* first = &a;
17 while (first !=NULL) /打印原先的链表内各节点的value 18 { 19 printf("%d ", first->value); 20 first = first->fwd; 21 } 22 putchar('\n'); 23 24 first = sll_reverse(&a); 25 26 27 while (first) //重新排序后 28 { 29 printf("%d ", first->value); 30 first = first->fwd; 31 } 32 33 return 0; 34 35 } 36 struct NODE* sll_reverse(struct NODE* first) 37 { 38 NODE* temp = first; 39 if (first == NULL) //空链表 40 return NULL; 41 42 int count = 0; 43 while (temp) //节点计数 44 { 45 count += 1; 46 temp = temp->fwd; 47 } 48 49 NODE**reverse_node = (NODE**)malloc(sizeof(NODE*) * count); //指针数组 50 if (reverse_node == NULL) 51 { 52 printf("Fail to allocate memeory"); 53 exit(1); 54 } 55 56 reverse_node[0] = first; //为数组的元素分配节点 57 for(int i = 1; i< count;i++) 58 { 59 reverse_node[i] = first->fwd; 60 first = first->fwd; 61 } 62 63 first = reverse_node[count-1]; //改变节点内指针的对象 64 while ((count -2)>=0) 65 { 66 reverse_node[count-1]->fwd = reverse_node[count - 2]; 67 count--; 68 } 69 reverse_node[0]->fwd = NULL; //尾部节点内的指针声明为NULL 70 71 free(reverse_node); 72 73 return first; 74 75 }

 

posted @ 2022-07-21 17:02  Tolerieren  阅读(27)  评论(0)    收藏  举报