user-0 提问: c语言链表头结点的删除出了点毛病，小白求指点

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  struct node {     double s;     struct node *next; };  typedef struct node NODE;  NODE *creat(int n) {     NODE  *h,*p,*q;     int i;      h = p = q = (NODE*)malloc(sizeof(NODE));     h->next=NULL;      for(i=0;i<n;i++)     {         scanf("%lf", &q->s);         q=(NODE*)malloc(sizeof(NODE));         p->next=q;         p=q;     }     p->next=NULL;     return h; } void outlist(NODE *h) {     NODE* p=h;     while(p->next!=NULL)     {         printf("%-6.2f",p->s);         p = p->next;     }     putchar('\n'); } double fun(NODE *h,int n) {     NODE *p=h;     double ave=0.0;     while(p->next!=NULL)     {         ave+=p->s;         p=p->next;     }     return ave/n; } NODE* deletenode(NODE *h,int n,int m) {     NODE *p,*q,*s;     int i;     p=h;     if(m==1) {         //s = p;         //p = p->next;         s = h;         h = h->next;         free(s);         s = NULL;          return h;    //直接返回     }//这里代码出错了     q = p->next;     for(i = 2; i <= n && q->next!=NULL;i++)         {             if(i == m)             {                 p->next=q->next;                 s = q;                 //q=q->next;                 free(s);                 s=NULL;                 break;    //跳出循环             }             else             {                 p=p->next;                 q=q->next;             }         }      return h; } NODE* deletenode1(NODE *h,int x) {     NODE *p,*q,*s;     p=h;     q=p->next;     while(q)     {         if(x==q->s)         {             p->next=q->next;             s=q;             q=q->next;             free(s);             s=NULL;         }         else         {             p=p->next;             q=q->next;         }     }     return h; }  //void main() int main() {     NODE *h;     int n,m,x;     double ave;     printf("链表包含多少元素:\n");     scanf("%d",&n);     printf("请输入链表元素&enter:\n");     h=creat(n);     printf("下面输出链表元素:\n");     outlist(h);     ave=fun(h,n);     printf("链表元素平均值:ave=%-6.2f\n",ave);     printf("需要删除第几个链表元素:\n");     scanf("%d",&m);     //deletenode(h,n,m);     h = deletenode(h,n,m);     printf("下面输出删除后的链表元素:\n");     outlist(h);     printf("删除指定链表元素:\n");     scanf("%d",&x);     //deletenode1(h,x);     h = deletenode1(h,x);     printf("下面输出删除后的链表元素:\n");     outlist(h); }  供参考～  建议对比一下找出自己的问题。 另外，楼主的链表最后一个节点是无用的，建议优化一下链表把左后一个节点去掉～

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

user: user-0
content: 结帖啦，谢谢各位啦,修改后代码如下  #include<stdio.h> #include<stdlib.h> struct node { 	double s; 	struct node *next; }; typedef struct node NODE; NODE *creat(int n) { 	NODE  *h,*p,*q; 	int i=0; 	h=p=(NODE*)malloc(sizeof(NODE)); 	h->next=NULL; 	while(i<n) 	{ 		q=(NODE*)malloc(sizeof(NODE)); 		scanf("%lf",&q->s); 		p->next=q; 		p=q; 		i++; 	} 	p->next=NULL; 	return h; } void outlist(NODE *h) { 	NODE* p=h; 	while(p->next!=NULL) 	{ 		p=p->next; 		printf("%-6.2f",p->s);	 	} 	putchar('\n'); } double fun(NODE *h,int n) { 	NODE *p=h; 	double ave=0.0; 	while(p->next!=NULL) 	{ 		p=p->next; 		ave+=p->s; 	} 	return ave/n; } int deletenode(NODE *h,int m) { 	NODE *p,*q; 	int i=0; 	double s; 	p=h; 	if((1>m) && (p->next==NULL)) 	{ 		printf("删除失败!\n"); 		return 0; 	} 	while(i<m-1) 	{ 		p=p->next; 		++i; 	} 	q=p->next; 	s=q->s; 	p->next=p->next->next; 	free(q); 	q=NULL; 	return s; } NODE* deletenode1(NODE *h,int x) { 	NODE *p,*q,*s; 	p=h; 	q=p->next; 	while(q) 	{ 		if(x==q->s) 		{ 			p->next=q->next; 			s=q; 			q=q->next; 			free(s); 			s=NULL; 		} 		else 		{ 			p=p->next; 			q=q->next; 		} 	} 	return h; } void main() { 	NODE *h; 	int n,m,x; 	double ave; 	printf("链表包含多少元素:\n"); 	scanf("%d",&n); 	printf("请输入链表元素&enter:\n"); 	h=creat(n); 	printf("下面输出链表元素:\n"); 	outlist(h); 	ave=fun(h,n); 	printf("链表元素平均值:ave=%-6.2f\n",ave); 	printf("删除指定链表元素:\n"); 	scanf("%d",&x); 	deletenode1(h,x); 	printf("下面输出删除后的链表元素:\n"); 	outlist(h); 	printf("需要删除第几个链表元素:\n"); 	scanf("%d",&m); 	deletenode(h,m); 	printf("下面输出删除后的链表元素:\n"); 	outlist(h); }

user: user-3
content: 你得把编译结果贴出来呀

user: user-0
content: 引用 1 楼 飞奔的小强sky的回复:我用脚丫子想都知道没人会闲的难受看你这么长的代码 我说了出错的地方，思路简单的小白，就是理解不了错误的地方该怎么改

user: user-3
content: 我用脚丫子想都知道没人会闲的难受看你这么长的代码