首页 > 代码库 > 单链表操作问题,主要是逆操作
单链表操作问题,主要是逆操作
工作无事,搞其它事也不太方便,写点简单代码。本来想写的高大上一些,发现用范型不是一点代码的事,还是算了。
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct list{ int val; struct list *next; }Node_def; #define NODE_SIZE (sizeof(Node_def))#undef T#define T Node_def#define T1 intT * Node_insert(T *head, T1 val){ if ( NULL == head) { return NULL; } T *p = (T*)malloc(NODE_SIZE); p->val = val; p->next = head->next; head->next = p; head->val++; return p;}T * Node_new(){ T *p = (T*)malloc(NODE_SIZE); p->next = NULL; p->val = 0; return p; }void Node_print(T *head){ if(!head) { printf("NULL\n"); return ; } printf("num of list is [%d]:\n", head->val); if(head->val == 0) return ; int i = 0; Node_def *p = head->next; while(p) { printf("[% 6d]", p->val); p = p->next; if(i++ == 10) { printf("\n"); i = 0; } } printf("\n");}void Node_free(T *head){ if(!head) return ; printf("num of list for free is [%d]:\n", head->val); if(head->val <= 0) return; T *p = head->next; T *pp; while(p) { pp = p; p = p->next ; //printf("[% 6d] ", pp->val); free(pp); } free(head); printf("\n");}void Node_inverse( T *head ){#if 0 if(!head) return ; if(head->val <= 0) return ; int num = head->val; int i; T1 *arr = (T1*)malloc(num); if(!arr) exit(0) ; i = 0; T *p = head->next; while(p) { arr[i++] = p->val; p = p->next; } for ( i = num-1 , p = head->next; i >= 0 ; i-- ) { p->val = arr[i]; p = p->next; }#else if(!head) return ; if(head->val <= 0) return ; int num = head->val; T *p = head->next; T *pp = p->next; p->next = NULL; head->next = p; while (pp) { p = pp; pp = pp->next; p->next = head->next; head->next = p; }#endif printf("inserve success\n");}int main(){ T *head = Node_new(); int i = 0; for ( i = 0 ; i < 1000; i ++) Node_insert(head, i); Node_print(head); Node_inverse(head); Node_print(head); Node_free(head); return 0;}
单链表的逆操作问题我用了两种方法,感觉第一种方法不太占优势。不过比较好理解。第二种就是常规方法了。
我这种方法是用了头指针的链表,如果没有头指针,要注意的地方是,逆操作要传指针的地址(或者返回第一个元素的地址)。当然,换成全局变量也是可以的。
有问题请指正 。(这些年工作没太大学习动力,与没人分享和讨论也有点关系)
单链表操作问题,主要是逆操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。