user-0 提问: 用单链表删除文本文档的第一个数据失败，其他删除不了

回复:
user: user-0
content: 上面是原代码，看了半天还是不懂该改哪里

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h> void insert(); void show(struct stu *head); void save(struct stu *head); struct stu *read(); void add(struct stu *head); void search(struct stu *head); void del(struct stu *head); int count(struct stu *head); struct stu *BubbleSort(struct stu *head);/  struct stu{ 	long num;     char name[10]; 	char course[10]; 	int score; 	int term; 	struct stu *next; };  //输入参数:链表head //返回值:NULL void add(struct stu *head) { 	long num;//学生学号 	char name[20];//学生姓名 	char course[20];//课程 	int score=-1;//成绩 	int term=0;//学期 	struct stu *ptr,*p; 	//ptr=NULL; 	for(ptr=head;ptr->next;ptr=ptr->next) 	{ 		// 	} 	 	 		printf("\n下面开始输入学生信息：\n"); 		printf("请输入学生学号:\n"); 		scanf("%ld",&num); 		printf("请输入学生姓名：\n"); 		scanf("%s",name); 		printf("请输入科目:\n"); 		scanf("%s",course); 		//printf("请输入成绩:\n"); 		//scanf("%d",&score); 		while(score==-1) 		{ 			printf("请输入分数(0—100):\n"); 			scanf("%d",&score); 			if(score>100||score<-1) 			{ 				printf("分数范围必须在0和100之间！\n"); 				score=-1; 			} 		} 		while(term==0) 		{ 			printf("请输入学期(1—8):\n"); 			scanf("%d",&term); 			if(term>8||term<0) 			{ 				printf("学期范围必须在1和8之间！\n"); 				term=0; 			} 		}  		p=(struct stu *) malloc(sizeof(struct stu)); 		p->num=num; 		p->score=score; 		p->term=term; 		strcpy(p->name,name); 		strcpy(p->course,course); 		p->next=NULL; 		ptr->next=p; 		//printf("%ld",ptr->num); 		printf(" 学生数据输入成功！\n"); 		getchar(); 		getchar(); 	 } //查找代码 void search(struct stu *head) { 	int choice,t,score; 	choice=t=0;//t是同特征的个数 	long num; 	char name[10],cpname[10]; 	struct stu *ptr; 	ptr=NULL; 	printf("\n请选择查询方式:\n"); 	printf("\n 1.按学号：\n\n"); 	printf("\n 2.按姓名：\n\n"); 	printf("\n 3.按成绩：\n\n"); 	printf("\n 4.返回主菜单：\n\n"); 	 	while(choice==0) 	{ 		printf("\n输入数字选择查询方式:"); 		scanf("%d",&choice); 		if(choice==1) 		{ 			printf("\n输入您要查询学生的学号:"); 			scanf("%ld",&num); 			printf("\n"); 			for(ptr=head;ptr;ptr=ptr->next) 			{ 				if(ptr->num==num) 				{ 					printf("****学号：%ld，姓名：%s，科目：%s，分数：%d，学期：%d\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term); 					t++; 				} 			} 			if(t==0) 			{ 				printf("\n**不存在学号为：%ld的学生！",num); 				 			} 			else 			{ 				printf("\n**以上是学号为：%ld的学生记录，共%d条！\n",num,t);  			} 			break; 			 		} 		else if(choice==2) 		{ 			printf("\n输入您要查询学生的姓名:"); 			scanf("%s",name); 			printf("\n"); 			for(ptr=head;ptr;ptr=ptr->next) 			{ 				strcpy(cpname,ptr->name); 				if(strcmp(cpname,name)==0) 				{ 					printf("****学号：%ld，姓名：%s，科目：%s，分数：%d，学期：%d\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term); 					t++; 				} 			} 			if(t==0) 			{ 				printf("\n**不存在姓名为：%s的学生！",name); 				 			} 			else 			{ 				printf("\n**以上是姓名为：%s的学生记录，共%d条！\n",name,t);  			} 			break; 		} 		else if(choice==3) 		{ 			printf("\n输入您要查询学生的分数:"); 			scanf("%d",&score); 			printf("\n"); 			for(ptr=head;ptr;ptr=ptr->next) 			{ 				 				if(score==ptr->score) 				{ 					printf("****学号：%ld，姓名：%s，科目：%s，分数：%d，学期：%d\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term); 					t++; 				} 			} 			if(t==0) 			{ 				printf("\n**不存在分数为：%d的学生！",score); 				 			} 			else 			{ 				printf("\n**以上是分数为：%d的学生记录，共%d条！\n",score,t);  			} 			break; 		} 		else if(choice==4) 		{ 			break; 		} 		else  		{  			choice=0; 			printf("\n注意：输入错误，只能输入1、2 或 3 ！\n"); 		} 	} 	printf("\n按回车键回到主菜单...\n"); 	getchar(); 	getchar(); 	 }  void del(stu *head) { 	struct stu *ptr,*pre,*pnext; 	ptr=pre=pnext=NULL; 	int choice,num; 	int t=0; 	if (head == NULL) 	{ 		printf("无学生记录！\n"); 	    return; 	} 	printf("\n请输入要删除的学生的学号："); 	scanf("%d",&num); 	for(ptr=head;ptr;ptr=ptr->next) 	{ 		  		if(ptr->next==NULL) 		{ 			if(ptr->num==num) 			{ 				pre->next=NULL; 				t++; 			} 			break; 			 		} 		pnext=ptr->next; 		pre=ptr; 		if(pnext->num-1==num){ 			pre->next=pnext->next; 			pre=pnext; 			free(pnext); 			printf("\n删除成功！\n"); 			break; 			t++; 		} 		 	}  	printf("\n按回车键回到主菜单...\n"); 	getchar(); 	getchar(); } struct stu *BubbleSort(struct stu *head) { 	int choice=0; 	struct stu *endpt; /*控制循环比较*/ 	struct stu *p; /*临时指针变量*/ 	struct stu *p1;  	struct stu *p2; 	endpt=p=p1=p2=NULL;  	p1 = (struct stu *)malloc(sizeof(struct stu));//分配结点空间 	p1->next = head; /*增加一个节点，放在第一个节点的前面，主要是为了便于比较。因为第一个节点没有前驱，不能交换地址。*/ 	head = p1; /*让head指向p1节点，排序完成后，我们再把p1节点释放掉*/  	printf("\n请选择排序字段："); 	printf("\n1.按学号排序"); 	printf("\n2.按分数排序"); 	while(choice==0) 	{ 		printf("\n请输入1或2："); 		scanf("%d",&choice); 		if(choice==1) 		{ 			for(endpt=NULL; endpt!=head; endpt=p) 			{ 				for(p=p1=head; p1->next->next!=endpt; p1=p1->next) 				{ 				   if (p1->next->num > p1->next->next->num) 					p2 = p1->next->next; 					p1->next->next = p2->next; 					p2->next = p1->next;  					p1->next = p2;  					p = p1->next->next;  				} 			} 			printf("\n***按学号排序成功！\n"); 			break;	 		} 		if(choice==2) 		{ 			for (endpt=NULL; endpt!=head; endpt=p)  			{ 				for (p=p1=head; p1->next->next!=endpt; p1=p1->next) 				{ 					if (p1->next->score > p1->next->next->score ) 				   { 					p2 = p1->next->next;  					p1->next->next = p2->next;  					p2->next = p1->next; 					p1->next = p2; 					p = p1->next->next;  				   } 				} 			} 			printf("\n***按分数排序成功！"); 			break; 		}   	} 	 	  	p1 = head; 	head = head->next; 	free(p1); /*释放p1*/ 	p1 = NULL;  	printf("\n***排序后...！"); 	show(head);  	return head; }   int count(struct stu *head) { 	int choice,count,bad,good; 	choice=count=bad=good=0;//选择 	struct stu *ptr; 	char sort; 	ptr=NULL; 	printf("不及格记录如下：",count); 	printf("\n"); 	printf("★★★学号     *姓名*     课程  分数  学期★★★\n");//输出格式 	for(ptr=head;ptr;ptr=ptr->next) 	{ 		count++; 		if(ptr->score<60) 		{ 			bad++; 			printf("*%10ld%10s%10s%5d%5d        *\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term); 		} 	} 	printf("☆———————————————————————————★\n"); 	printf("\n"); 	printf("***有%d条不及格记录\n",bad); 	printf("***共有%d条记录...\n",count);  	printf("\n优秀记录如下：\n",count); 	printf("**★**学号     *姓名*     课程  分数  学期**★**\n");//输出格式 	for(ptr=head;ptr;ptr=ptr->next) 	{ 		count++; 		if(ptr->score>80) 		{ 			good++; 			printf("*%10ld%10s%10s%5d%5d        *\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term); 		} 	} 	printf("★———————————————————————————☆\n"); 	printf("\n"); 	printf("有%d条优秀记录\n",good); 	getchar();  	printf("\n*是否对分数进行冒泡排序？输入Y/n 进行排序...\n"); 	scanf("%c",&sort); 	if(sort=='y'||sort=='Y') 	{ 		BubbleSort(head); 		/*for(int i=0;i<count-1;i++) 		{ 			for(int j=count-1;j>i;--j) 			{ 			} 		}*/  		return 1; 		 	} 	else 	{ 		printf("\n您选择不进行冒泡排序。"); 		return 0; 	}  	 }  void show(struct stu *head) { 	struct stu *ptr=NULL; 	if(head==NULL) 	{ 		printf("\n 没有记录 \n"); 		return; 	} 	printf("\n所有记录如下：\n"); 	printf("\n"); 	printf("\n******学号     *姓名*     课程  分数  学期********\n");//输出格式 	for(ptr=head;ptr;ptr=ptr->next){ 		printf("%10ld%10s%10s%5d%5d\n",ptr->num,ptr->name,ptr->course,ptr->score,ptr->term);//显示一条信息 	} 	//	fscanf(fp,"%ld%s%s%d%d",&num,name,course,&score,&term); 	  }   //返回值：链表的head //功能描述：将student.txt文件中的学生信息逐条读出到链表 struct stu *read() { 	struct stu *head,*p,*tail; 	//tail=(struct stu *) malloc(sizeof(struct stu)); 	head=tail=NULL; 	long num;//学生学号 	char name[10];//学生姓名 	char course[10];//课程 	int score;//成绩 	int term;//学期  	FILE *fp;//文件指针	 	//以只读方式打开student.txt文件 	if(NULL==(fp=fopen("student.txt","r"))){  		printf("没有任何记录!\n"); 		return NULL; 	} 	fscanf(fp,"%ld%s%s%d%d",&num,name,course,&score,&term);//读取学生的信息  	while(!feof(fp)){ 		 		p=(struct stu *) malloc(sizeof(struct stu)); 		p->num=num; 		strcpy(p->name,name); 		strcpy(p->course,course); 		p->score=score; 		p->term=term; 		p->next=NULL; 		//printf("%ld\n",p->num); 		if(head==NULL) 		{ 			head=p; 		} 		else 		{ 			tail->next=p; 		} 		tail=p; 		fscanf(fp,"%ld%s%s%d%d",&num,name,course,&score,&term);//读取学生的信息  	} 	//关闭文件 	if(fclose(fp)){  		printf("File close error!\n"); 		exit(0); 	}     return head; }  //输入参数：NULL //返回值：链表的head //功能描述：将链表的学生信息保存到student.txt文件中 void save(struct stu *head) { 	struct stu *p; 	p=NULL; 	FILE *fp;//文件指针  	//打开student.txt文件 	if(NULL==(fp=fopen("student.txt","w"))){ 		 		//如果打开文件失败，就成了一个空指针 		printf("File student.txt open error!\n"); 		exit(0); 	} 	else 	{ 		for(p=head;p;p=p->next) 		{ 			fprintf(fp,"%10ld%10s%10s%5d%5d\n",p->num,p->name,p->course,p->score,p->term);//将信息写入文件 		} 	} 	//关闭文件 	if(fclose(fp)){  		printf("File close error!\n"); 		exit(0); 	}  } //主函数！ int main(){  	int choice=0;//选择功能 	int sort=0;//选择是否保存排序结果 	struct stu *head=read(); 	//显示主页面 	printf("★———————————————————————————★\n"); 	printf("                        学生成绩管理系统                \n\n"); 	printf("                  学号姓名：1200370221廖祖昌            \n\n"); 	printf("                     日期：2016年10月8日                \n\n"); 	printf("          ☆一一一一一一一一一一一一--一一一一一☆      \n\n"); 	//显示功能页面 	while(-1!=choice){  		printf("★——————————————————————————★\n"); 		printf("★—☆          欢迎进入学生成绩管理系统          ☆—★\n"); 		printf("★——————————————————————————★\n\n"); 		printf("                    1:输入数据                   \n\n"); 		printf("                    2:显示数据                   \n\n"); 		printf("                    3:删除数据                   \n\n"); 		printf("                    4:查询数据                   \n\n"); 		printf("                    5:统计与排序                 \n\n"); 		printf("                    -1:退出系统                  \n\n"); 	    printf("                请输入以上数字选择操作:          \n");//功能提示 		scanf(" %d",&choice);//choice接受用户选择的功能 		switch(choice){ 	    //数据输入(增加一个学生的信息) 		case 1: 			add(head); 			save(head); 			break; 		//显示所有记录 		case 2: 			show(head); 			printf("\n按回车键回到主菜单...\n"); 			getchar(); 			getchar(); 			break; 			//显示删除后的页面 		case 3: 			show(head); 			del(head); 			save(head); 			break; 			//执行查找功能 		case 4: 			search(head); 			break; 			//执行排序与统计功能 		case 5: 			sort=count(head); 			if(sort==1) 			{ 				save(head); 			} 			head=read(); 			printf("\n按回车键回到主菜单...\n"); 			getchar(); 			getchar(); 			break; 	    //退出软件 		case -1: 			save(head); 			printf("\n\n☆—★           谢谢使用学生成绩管理系统         ★—☆\n\n"); 			break; 		//错误输入 	    default: 			printf("\n错误输入，请重新输入数字选择功能!\n"); 			break; 		} 	} 	return 0; }

user: user-0
content: 引用 14 楼 qq_33446306 的回复:[quote=引用 13 楼 qq_33446306 的回复:] [quote=引用 12 楼 qq423399099 的回复:] 1.声明改一下，改成：void del(struct stu **head); 2.调用改成:del(&head);  这样就直接显示无学生记录 了[/quote]      啊 ，  可以了， 是 删除函数前面有个ptr=  没改，改了之后就好了，不过变成 最后一个删不了了，    而且点删除操作后不提示删除成功 得自己去看才会发现[/quote]    上面操作是只把ptr删掉，pre = pnext = NULL;语句还在，之后这行代码注释掉后就没问题了

user: user-0
content: 引用 13 楼 qq_33446306 的回复:[quote=引用 12 楼 qq423399099 的回复:] 1.声明改一下，改成：void del(struct stu **head); 2.调用改成:del(&head);  这样就直接显示无学生记录 了[/quote]    啊 ，  可以了， 是 删除函数前面有个ptr=pre = pnext = NULL;  没改，改了之后就好了，不过变成 最后一个删不了了，    而且点删除操作后不提示删除成功 得自己去看才会发现

user: user-0
content: 引用 12 楼 qq423399099 的回复:1.声明改一下，改成：void del(struct stu **head); 2.调用改成:del(&head);  这样就直接显示无学生记录 了

user: user-1
content: 1.声明改一下，改成：void del(struct stu **head); 2.调用改成:del(&head);

user: user-0
content: 引用 10 楼 qq423399099 的回复:不是让你改成这样if(pnext->num-1==num)，这样不对的。 你这个链表是不带头结点的，所以一旦你输入的num等于第一个结点，你是删除不掉的（除非传二级指针） 有几个方法： 1.链表改成带头结点的 2.参数传二级指针或者一级指针的引用 3.del改成带返回值的，重新返回head 下面这样试试：  void del(stu **head) { 	struct stu *ptr = *head, *pre, *pnext; 	ptr = pre = pnext = NULL; 	int choice, num; 	int t = 0; 	if (ptr == NULL) 	{ 		printf("无学生记录！\n"); 		return; 	} 	printf("\n请输入要删除的学生的学号："); 	scanf("%d", &num); 	if (ptr->num == num){ 		*head = ptr->next; 		free(ptr); 	} 	else{ 		for (; ptr; ptr = ptr->next) 		{  			if (ptr->next == NULL) 			{ 				if (ptr->num == num) 				{ 					pre->next = NULL; 					t++; 				} 				break;  			} 			pnext = ptr->next; 			pre = ptr; 			if (pnext->num == num){ 				pre->next = pnext->next; 				pre = pnext; 				free(pnext); 				printf("\n删除成功！\n"); 				break; 				t++; 			}  		} 	}  	printf("\n按回车键回到主菜单...\n"); 	getchar(); 	getchar(); }   运行之后出现这两个错误

user: user-1
content: 不是让你改成这样if(pnext->num-1==num)，这样不对的。 你这个链表是不带头结点的，所以一旦你输入的num等于第一个结点，你是删除不掉的（除非传二级指针） 有几个方法： 1.链表改成带头结点的 2.参数传二级指针或者一级指针的引用 3.del改成带返回值的，重新返回head 下面这样试试：  void del(stu **head) { 	struct stu *ptr = *head, *pre, *pnext; 	ptr = pre = pnext = NULL; 	int choice, num; 	int t = 0; 	if (ptr == NULL) 	{ 		printf("无学生记录！\n"); 		return; 	} 	printf("\n请输入要删除的学生的学号："); 	scanf("%d", &num); 	if (ptr->num == num){ 		*head = ptr->next; 		free(ptr); 	} 	else{ 		for (; ptr; ptr = ptr->next) 		{  			if (ptr->next == NULL) 			{ 				if (ptr->num == num) 				{ 					pre->next = NULL; 					t++; 				} 				break;  			} 			pnext = ptr->next; 			pre = ptr; 			if (pnext->num == num){ 				pre->next = pnext->next; 				pre = pnext; 				free(pnext); 				printf("\n删除成功！\n"); 				break; 				t++; 			}  		} 	}  	printf("\n按回车键回到主菜单...\n"); 	getchar(); 	getchar(); }

user: user-2
content: 再供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

user: user-2
content: 仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*q1,*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;     }      //将整个链表逆序     if (head->next!=NULL && head->next->next!=NULL) {         p=head->next;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head->next=p;     }      //输出整个单链表     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; } //84->28->20->23->96->19->59->97->29->41-> //84->28->05->20->23->96->19->59->97->29->41-> //84->28->05->20->96->19->59->97->29->41-> //05->19->20->28->29->41->59->84->96->97-> //97->96->84->59->41->29->28->20->19->05-> //41->29->28->20->19->05->97->96->84->59-> //

user: user-3
content: 单步跟踪程序运行，观察每一步变化，分析原因

user: user-0
content: 其他可以删除  就是第一排数据删除不了  标题打错

user: user-2
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224

user: user-0
content: 求大神解答，O(∩_∩)O谢谢

user: user-1
content: 楼主没贴全代码（如果第一个元素删不掉说明楼主的链表是不带头结点的） 那么意味着其实和num比较是从第二个结点开始的，因为你比较的是if (next->num == num) 而第一次for循环的时候，next指向的是第二个结点，而不是第一个结点（所以第一个结点永远无法比较到）