单链表的反序:将已有链表的节点的值反序
废话不多说直接上代码;下面代码提供了两个版本,sll_reverse是我自己做的时候想的笨办法,answer_reverse是我在网上看的一个版本(非常精简)。
1 #include<stdio.h> 2 #include <stdlib.h> 3 #define N 5 4 typedef struct NODE{ 5 struct NODE *link; 6 int value; 7 }Node; 8 Node* sll_reverse(Node *first); 9 int sll_insert( register Node **linkp, int new_value ); 10 void print(Node* rootp); 11 unsigned int count(Node*linkp); 12 struct NODE *answer_reverse( struct NODE *current ); 13 int main (void) 14 { 15 Node *p1 = (Node *)malloc( sizeof( Node ) ); 16 p1->link=NULL; 17 p1->value=5; 18 int i; 19 int value; 20 printf("输入想要插入的值: "); 21 while(scanf("%d",&value)==1) 22 sll_insert(&p1,value); 23 print(p1); 24 printf(" 经过反序后,链表中的内容为: "); 25 //print(sll_reverse(p1)); 26 print(answer_reverse(p1)); 27 return 0; 28 } 29 unsigned int count(Node*linkp) 30 { 31 unsigned int num=0; 32 Node *tmp=linkp; 33 if(!linkp) 34 { 35 printf("link is NULL "); 36 exit(1); 37 } 38 while(tmp) 39 { 40 ++num; 41 tmp=tmp->link; 42 } 43 return num; 44 } 45 Node* sll_reverse(Node *first) 46 { 47 if(first==NULL)//先判断是否是空表 48 return NULL; 49 Node *newnode=(Node*)malloc(sizeof(Node)); 50 if(newnode==NULL) 51 return NULL; 52 53 Node*tmp=first; 54 int n=count(first);//计算已经存在的单链表中的节点数目 55 int *p=(int*)malloc(n*sizeof(int));//进行动态数组分配 56 int i=0; 57 while(tmp!=NULL)//将原链表中节点的数据存储到动态数组中 58 { 59 p[i++]=tmp->value; 60 tmp=tmp->link; 61 } 62 newnode->link=NULL; 63 newnode->value=p[n-1];//创建链表的第一个节点,并把动态数组的最后一个值赋值 64 for(i=n-2;i>=0;i--)//从动态数组打的倒数第二个数据开始,一次不排序的插入到新链表中 65 insert(&newnode,p[i]); 66 return newnode; 67 } 68 struct NODE *answer_reverse( struct NODE *current )//答案的版本 69 { 70 struct NODE *previous=NULL; 71 struct NODE *next; 72 //for( previous = NULL; current != NULL; current = next ){ 73 //next = current->link; 74 //current->link = previous; 75 //previous = current; 76 //} 77 while(current!=NULL) 78 { 79 next=current->link;//next保存原链表的当前指针的下一个指针 80 current->link=previous;//改变当前指针的执向,也就是构建新的链表 81 previous=current;//把原链表的第一个节点作为新链表的最后一个节点 82 current=next;//把next的值赋值给current,直到current==NULL 83 } 84 return previous; 85 } 86 int insert(Node **linkp,int value) 87 { 88 Node *current; 89 Node *new; 90 while((current=*linkp)!=NULL) 91 linkp=¤t->link; 92 new=(Node*)malloc(sizeof(struct NODE)); 93 if(new==NULL) 94 return -1; 95 new->value=value; 96 new->link=current; 97 *linkp=new; 98 return 0; 99 } 100 int 101 sll_insert( register Node **linkp, int new_value ) 102 { 103 register Node *current; 104 register Node *new; 105 106 107 while( ( current = *linkp ) != NULL && 108 current->value < new_value ) 109 linkp = ¤t->link; 110 111 112 new = (Node *)malloc( sizeof( Node ) ); 113 if( new == NULL ) 114 return -1; 115 new->value = new_value; 116 117 118 new->link = current; 119 *linkp = new; 120 return 0; 121 } 122 void print(Node* rootp) 123 { 124 if(rootp==NULL) 125 exit(1); 126 Node*tmp=rootp; 127 while(tmp) 128 { 129 printf("value=%d ",tmp->value); 130 tmp=tmp->link; 131 } 132 }