user-0 提问: 菜鸟求助，创建一个单链表，程序检查没错，但运行老是出问题

回复:
user: user-1
content: void printlist(linklist l)  { node *p;//少了一个p = l while(p->data!=null) { printf("information:"); printf(" d%\n",p->data); p=p->next; } }

user: user-2
content: 你创建链表的逻辑有问题，你应该先创建一个头结点设为空，然后再去调用加入一个节点的函数，如果头结点为空，那么这个新加入的节点就是头结点，如果头结点不为空，那么遍历这个链表找到最后一个节点，然后将新节点连入末尾，要记得每加入一个节点的next要指向空哦

user: user-3
content: 引用 2 楼 PingShanJuShi 的回复:你创建链表的逻辑有问题，你应该先创建一个头结点设为空，然后再去调用加入一个节点的函数，如果头结点为空，那么这个新加入的节点就是头结点，如果头结点不为空，那么遍历这个链表找到最后一个节点，然后将新节点连入末尾，要记得每加入一个节点的next要指向空哦创建链表只要有清晰的思路，很容易的！二楼说的对！

user: user-3
content: 单链表的创建及增删改，供参考！ 链表的“增删改”  #include <stdio.h> #include <stdlib.h> struct node*creat(struct node *head); void Output(struct node *head); void Insert(struct node *head,int k); void Delete(struct node *head,int j); void Replace(struct node *head,int n); struct node {  	int data; 	struct node *next; }; int main(){      int a,b,c,d; 	struct node *head; 	head=NULL;   	head=creat(head);//新建链表 	Output(head);   	do{ 		printf("\n"); 		printf("请选择您要进行的操作：\n"); 		printf("----------------------------------------\n"); 		printf("1.添加新结点\n"); 		printf("2.删除结点\n"); 		printf("3.修改结点数据\n"); 		printf("4.退出\n"); 		printf("----------------------------------------\n"); 		printf("\n"); 		printf("请选择："); 		scanf("%d",&d);  	switch(d) 	{ 		case 1: 			printf("您选择了添加新结点\n"); 	       printf("请输入要插入结点位置:");//插入新结点 	       scanf("%d",&a); 	       Insert(head,a); 	       Output(head); 		   break; 		case 2: 			printf("您选择了删除结点\n"); 	       printf("请输入要删除的结点:");//删除结点 	       scanf("%d",&b); 	       Delete(head,b); 	       Output(head); 		   break; 		case 3: 			printf("您选择了修改结点数据\n"); 	       printf("请输入要修改结点的位置:");//修改结点数据            scanf("%d",&c); 	       Replace(head,c); 	       Output(head); 		   break; 		case 4: 			break; 	} 	}while(d!=4);  	//printf("\n"); 	//printf("请输入要插入结点位置:");//插入新结点 	//scanf("%d",&a); 	//Insert(head,a); 	//Output(head);  	//printf("\n"); 	//printf("请输入要删除的结点:");//删除结点 	//scanf("%d",&b); 	//Delete(head,b); 	//Output(head);   	//printf("\n"); 	//printf("请输入要修改结点的位置:");//修改结点数据 	//scanf("%d",&c); 	//Replace(head,c); 	//Output(head);  	return 0; } struct node *creat(struct node *head){  	int i,LEN; 	struct node *p,*s; 	printf("请输入链表的长度："); 	scanf("%d",&LEN); 	 	if(LEN>=1){ 		for(i=1;i<=LEN;i++){		           p=(struct node *)malloc(sizeof(struct node *)); 			 			if(head==NULL) 				s=head=p; 			printf("请输入第%d个结点中的数据：",i); 			scanf("%d",&p->data); 			p->next=NULL; 			s->next=p; 			s=p; 		} 	}return (head); } void Output(struct node *head){  	struct node *temp; 	temp=head; 	printf("新链表如下："); 	while(temp!=NULL){ 	 		printf("%d->",temp->data); 		temp=temp->next; 	} }  void Insert(struct node *head,int k){  	struct node *p1,*p2,*p3; 	int i; 	p3=p1=head; 	for(i=1;i<k;i++){ 		p1=p1->next; 	} 		for(i=1;i<k-1;i++){ 		p3=p3->next; 	} 	p2=(struct node *)malloc(sizeof(struct node)); 	printf("请输入新结点的数据："); 	scanf("%d",&p2->data); 	p2->next=p1; 	p3->next=p2; }  void Delete(struct node *head,int j){  	int i; 	struct node *p1,*p2,*p3; 	p1=p2=p3=head; 	for(i=1;i<=j;i++){ 		p2=p2->next; 	} 	/*p1->next=NULL; 	p3=p2->next; 	free(p2); 	p1->next=p3;*/  		for(i=1;i<j-1;i++){ 		p1=p1->next; 	} 			for(i=1;i<j+1;i++){ 		p3=p3->next; 	} 			p1->next=p3; 			//free(p2); }  void Replace(struct node *head,int n){  	int i,m; 	struct node *p; 	p=head; 	for(i=1;i<n;i++){ 		p=p->next; 	} 	printf("请输入该结点的新数据："); 	scanf("%d",&m); 	p->data=m; 	//free(p);  }

user: user-4
content: 仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //