user-0 提问: C语言链表问题

回复:
user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 2 楼 hefashion0190 的回复:] 可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8 对比#1和#2，我觉得wiki上的图不如我的图讲得更清楚。[/quote]

user: user-2
content: 函数参数应尽量少，看到楼主的传入参数并没有带入到函数内数值，而是把参数当做内部普通局部变量使用，这样倒不如去掉该参数，改成在函数内定义局部变量。 参数的增加会导致程序的运行效率降低，如果是初学者可以暂不考虑这个问题导致的效率降低。

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  typedef struct LNode {     int data;     struct LNode *next; } LNode,*Linklist;  void Creatlist(Linklist head,int n); void Traverselist(Linklist head); void del(Linklist head,int j); void rev(Linklist head,int n); void search(Linklist head,int i); void Insert(Linklist head,int i,int e);  int main() {     int n,i,e,j;     Linklist head;     head=(Linklist)malloc(sizeof(LNode));     if(head==NULL)         exit(1);     Creatlist(head,n);     printf("遍历链表，输出链表:\n");     Traverselist(head);      search(head,i);     Insert(head,i,e);     printf("插入后的链表为:\n");     Traverselist(head);     del(head,j);     printf("删除后的链表为:\n");     Traverselist(head);     rev(head,n);     printf("逆序后的链表为:\n");     Traverselist(head);     getchar();     return 0; } void Creatlist(Linklist head,int n) {     int i;     head->next=NULL;     Linklist p,q;     q = head;     /*  多余的一个节点     p = (Linklist)malloc(sizeof(LNode));     if(p==NULL)         exit(1);     */     printf("请输入结点个数n的值:");     scanf("%d",&n);     printf("请输入各个结点的值:");     for(i=0;i<n;i++)     {         p=(Linklist)malloc(sizeof(LNode));         scanf("%d", &p->data);         p->next=NULL;         q->next = p;         q = p;     } } void Traverselist(Linklist head) {     Linklist p;     p=head->next;     while(p!=NULL)     {         printf("%3d",p->data);         p = p->next;     } } void search(Linklist head,int i) {     printf("\n请输入查找第i个结点的i的值:");     scanf("%d",&i);     Linklist p;     p = head;     int j=1;     while((p->next)&&(j<=i))     {         p=p->next;         j++;     }     if (!p->next) {         printf("Can't find it!\n");         return;     }     printf("%d",p->data); } void Insert(Linklist head,int i,int e) {     printf("\n在第i个结点前插入一个整数e,请分别输入i和e的值:");     scanf("%d%d", &i, &e);     Linklist p,q;     p = head;     int j = 1;     while((p->next)&&(j<i))     {         p = p->next;         j++;     }     if (!p->next && j < i) {         printf("插入位置错误");         return;     }      q = (Linklist)malloc(sizeof(LNode));     q->data = e;     q->next = p->next;     p->next = q; } void del(Linklist head,int j) {     Linklist p,q;     p=head;     int i=1;     printf("\n请输入要删除的第j个元素的值:");     scanf("%d", &j);     while((p->next)&&(i<j))     {         p = p->next;         i++;     }     if (!p->next && i < j) {         printf("删除位置不合理");         return;     }     q = p->next;     p->next = q->next;     free(q); } /*void del(Linklist head)   {   int j,i=0;   printf("\n输入j的值:\n");   scanf("%d",&j);   Linklist p,q;   p=head;   q=head;   for(i=1;i<=j;i++)   p=p->next;   if(p==NULL)   exit(0);   for(i=1;i<j;i++)   q=q->next;   q->next=p->next;   p->next=NULL;   free(p);   printf("当前序列为:\n");   q=head->next;   while(q)   {   printf("%d\t",q->data);   q=q->next;   }   printf("\n");   }*/ void rev(Linklist head,int n) {     Linklist p, q, r;      if(head==NULL)         return; #if 1     q = head;     p = head->next;     head->next = NULL;      while (p) {         r = p->next;         p->next = q->next;         q->next = p;         p = r;     } #else     p = head->next;     q = p->next; //q为p下一个节点     while(q)     {         r=q->next; //r为q下一个节点         q->next=p; //指针回指         p=q;         q=r;          //p, q后移    *关键是对指针间赋值的理解*     }     //head->next=p; #endif }  参考一下吧  多个功能有多处错误； 添加链表，搜索，插入和删除都有一些逻辑问题。 逆序存在死循环的问题。问题都一一修改了，建议对比一下代码找一下自己的原因。

user: user-3
content: 引用 2 楼 hefashion0190 的回复:可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8 对比#1和#2，我觉得wiki上的图不如我的图讲得更清楚。

user: user-1
content: 可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633