user-0 提问: 数据结构--关于单链表的一些操作，程序运行一半停止，不知道哪里有问题，求助！！！

回复:
user: user-1
content: 引用 3 楼  的回复:[quote=引用 2 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList_L(linklist *L,int n); void ListTraverse(linklist L,int n); void ListInsert(linklist L,int i,int e,int n);  //n为链表中结点个数 ,i为第i个元素前插入，e是新结点的值 void ListDelete(linklist L,int i,int *node,int n);  //n为链表中结点个数 ,i为删除结点的位置，e用来返回删除结点的值 void visit(linklist p);  int main() {     linklist L;     int n,i=5,e=999,*node;      printf("请输入你想建立单链表的结点个数：\n");     scanf("%d",&n);      CreatList_L(&L,n);   //逆序建立单链表,并将单链表的头地址赋给指针s     ListTraverse(L,n);  //遍历单链表     ListInsert(L,i,e,n);  //插入     ListDelete(L,i,node,n);  //删除  }  void CreatList_L(linklist *L,int n)  //逆序建立 {     printf("-----逆序建立------\n");     linklist p;     int i;     *L=(Lnode*)malloc(sizeof(Lnode)); //建立带头结点的单链表     //L->next==NULL;     (*L)->next = NULL;     for(i=n;i>0;i--)     {         p=(Lnode*)malloc(sizeof(Lnode));         printf("please enter a number:\n");         scanf("%d",&p->data);         p->next=(*L)->next;         (*L)->next=p;     }  }  void ListTraverse(linklist L,int n) //遍历单链表 {     printf("\n\n-------遍历--------\n");     int i;     linklist p;     p=L->next;     for(i=0;i<n;i++)     {         visit(p);         p=p->next;     } }  void visit(linklist p) //输出 {     printf("%d  ",p->data); }  void ListInsert(linklist L,int i,int e,int n) //第5个元素前插入元素 {     printf("\n\n-----插入元素------\n");     linklist p,q;     p=L;     //e=999;     //i=5;     int j=0;     while((p->next)&&j<i-1) //寻找第i-1个结点位置     {           p=p->next;         j++;      }     if(p->next==NULL)  //插入位置不合理     {         printf("ERROR!插入位置不合理！");         exit(0);     }     q=(Lnode*)malloc(sizeof(Lnode));  //建立新结点     q->data=e;     q->next=p->next;  //连入链表     p->next=q;     printf("\n插入成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n+1;i++)     {         p=p->next;         visit(p);     } }  void ListDelete(linklist L,int i,int *node,int n)  //删除第i个元素 {     printf("\n\n-----删除元素------\n");     linklist p,q;     p=L;     //i=5;     int j=0;     while(p->next&&j<i-1) //寻找删除结点的上个结点地址     {         p=p->next;         j++;     }     if(p->next==NULL)  //删除位置不合理     {         printf("ERROR!删除位置不合理！");         exit(0);     }     q=p->next;  //删除结点     p->next=q->next;     *node=q->data;     free(q);  //释放结点     printf("\n删除成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n-1;i++)     {         p=p->next;         visit(p);     } }  供参考～  为什么创建单链表时一定要用二级指针呢？？这点一直不太明白，一级指针传入的不也是地址吗？？ 希望可以讲解一下！非常感谢！！！[/quote]  参数传递是值传递，你把main函数的指针传进去，对这个指针做修改了吗？传二重指针，就可以对这个main函数里的指针进行修改。

user: user-0
content: 引用 2 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList_L(linklist *L,int n); void ListTraverse(linklist L,int n); void ListInsert(linklist L,int i,int e,int n);  //n为链表中结点个数 ,i为第i个元素前插入，e是新结点的值 void ListDelete(linklist L,int i,int *node,int n);  //n为链表中结点个数 ,i为删除结点的位置，e用来返回删除结点的值 void visit(linklist p);  int main() {     linklist L;     int n,i=5,e=999,*node;      printf("请输入你想建立单链表的结点个数：\n");     scanf("%d",&n);      CreatList_L(&L,n);   //逆序建立单链表,并将单链表的头地址赋给指针s     ListTraverse(L,n);  //遍历单链表     ListInsert(L,i,e,n);  //插入     ListDelete(L,i,node,n);  //删除  }  void CreatList_L(linklist *L,int n)  //逆序建立 {     printf("-----逆序建立------\n");     linklist p;     int i;     *L=(Lnode*)malloc(sizeof(Lnode)); //建立带头结点的单链表     //L->next==NULL;     (*L)->next = NULL;     for(i=n;i>0;i--)     {         p=(Lnode*)malloc(sizeof(Lnode));         printf("please enter a number:\n");         scanf("%d",&p->data);         p->next=(*L)->next;         (*L)->next=p;     }  }  void ListTraverse(linklist L,int n) //遍历单链表 {     printf("\n\n-------遍历--------\n");     int i;     linklist p;     p=L->next;     for(i=0;i<n;i++)     {         visit(p);         p=p->next;     } }  void visit(linklist p) //输出 {     printf("%d  ",p->data); }  void ListInsert(linklist L,int i,int e,int n) //第5个元素前插入元素 {     printf("\n\n-----插入元素------\n");     linklist p,q;     p=L;     //e=999;     //i=5;     int j=0;     while((p->next)&&j<i-1) //寻找第i-1个结点位置     {           p=p->next;         j++;      }     if(p->next==NULL)  //插入位置不合理     {         printf("ERROR!插入位置不合理！");         exit(0);     }     q=(Lnode*)malloc(sizeof(Lnode));  //建立新结点     q->data=e;     q->next=p->next;  //连入链表     p->next=q;     printf("\n插入成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n+1;i++)     {         p=p->next;         visit(p);     } }  void ListDelete(linklist L,int i,int *node,int n)  //删除第i个元素 {     printf("\n\n-----删除元素------\n");     linklist p,q;     p=L;     //i=5;     int j=0;     while(p->next&&j<i-1) //寻找删除结点的上个结点地址     {         p=p->next;         j++;     }     if(p->next==NULL)  //删除位置不合理     {         printf("ERROR!删除位置不合理！");         exit(0);     }     q=p->next;  //删除结点     p->next=q->next;     *node=q->data;     free(q);  //释放结点     printf("\n删除成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n-1;i++)     {         p=p->next;         visit(p);     } }  供参考～  为什么创建单链表时一定要用二级指针呢？？这点一直不太明白，一级指针传入的不也是地址吗？？ 希望可以讲解一下！非常感谢！！！

user: user-1
content: #include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList_L(linklist *L,int n); void ListTraverse(linklist L,int n); void ListInsert(linklist L,int i,int e,int n);  //n为链表中结点个数 ,i为第i个元素前插入，e是新结点的值 void ListDelete(linklist L,int i,int *node,int n);  //n为链表中结点个数 ,i为删除结点的位置，e用来返回删除结点的值 void visit(linklist p);  int main() {     linklist L;     int n,i=5,e=999,*node;      printf("请输入你想建立单链表的结点个数：\n");     scanf("%d",&n);      CreatList_L(&L,n);   //逆序建立单链表,并将单链表的头地址赋给指针s     ListTraverse(L,n);  //遍历单链表     ListInsert(L,i,e,n);  //插入     ListDelete(L,i,node,n);  //删除  }  void CreatList_L(linklist *L,int n)  //逆序建立 {     printf("-----逆序建立------\n");     linklist p;     int i;     *L=(Lnode*)malloc(sizeof(Lnode)); //建立带头结点的单链表     //L->next==NULL;     (*L)->next = NULL;     for(i=n;i>0;i--)     {         p=(Lnode*)malloc(sizeof(Lnode));         printf("please enter a number:\n");         scanf("%d",&p->data);         p->next=(*L)->next;         (*L)->next=p;     }  }  void ListTraverse(linklist L,int n) //遍历单链表 {     printf("\n\n-------遍历--------\n");     int i;     linklist p;     p=L->next;     for(i=0;i<n;i++)     {         visit(p);         p=p->next;     } }  void visit(linklist p) //输出 {     printf("%d  ",p->data); }  void ListInsert(linklist L,int i,int e,int n) //第5个元素前插入元素 {     printf("\n\n-----插入元素------\n");     linklist p,q;     p=L;     //e=999;     //i=5;     int j=0;     while((p->next)&&j<i-1) //寻找第i-1个结点位置     {           p=p->next;         j++;      }     if(p->next==NULL)  //插入位置不合理     {         printf("ERROR!插入位置不合理！");         exit(0);     }     q=(Lnode*)malloc(sizeof(Lnode));  //建立新结点     q->data=e;     q->next=p->next;  //连入链表     p->next=q;     printf("\n插入成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n+1;i++)     {         p=p->next;         visit(p);     } }  void ListDelete(linklist L,int i,int *node,int n)  //删除第i个元素 {     printf("\n\n-----删除元素------\n");     linklist p,q;     p=L;     //i=5;     int j=0;     while(p->next&&j<i-1) //寻找删除结点的上个结点地址     {         p=p->next;         j++;     }     if(p->next==NULL)  //删除位置不合理     {         printf("ERROR!删除位置不合理！");         exit(0);     }     q=p->next;  //删除结点     p->next=q->next;     *node=q->data;     free(q);  //释放结点     printf("\n删除成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n-1;i++)     {         p=p->next;         visit(p);     } }  供参考～

user: user-2
content: 可在VS里面下断点，单步调试。