你的答案

  今天写了一个关于链表的通讯录。但这并不是重点,我满心欢喜的将所有代码写完,并且对函数进行了一一的调试。就在我认为大功告成的时候,我点击了运行,好像没问题,转折出现了,我输入了第一个数据。

   “ 请按任意键继续”。

  “what?”,调试不是通过了吗。

  揣着这个疑问我又对我程序进行了一遍,没问题啊!!!

  不死心的我又试了一遍,结果还是一样--程序调试一切正常,但一运行起来就崩溃。

  我的头都要秃了。

  在请教了一个又一个人后,我还是没能解决这个问题。但是又一个转折来了,我请教了我们实验室的一位学长,他给了我一些建议,让我看看调试和运行输入的数据有没有差异。所以我对我调试的进行了copy and paste,奇迹出现了,程序居然运行起来了,没有再次崩溃。我不敢相信,重新点击运行,并且像以前一样,正常的从键盘输入数据,它竟然没有崩溃。

  虽然问题解决了,但我完全不知道问题出在哪,又是怎么解决的。对于这个玄学代码,我只想用一首歌来表达当时的心情。

  小朋友,你是否有很多问号

  问题已得到解决。解决办法:head=(Head *)malloc(sizeof(head));改为 head=(Head *)malloc(sizeof(Head));

  经验教训:再次遇到此类情况或其他无明显逻辑问题的错误后,一定要对自己的代码仔细的审查,是否有单词有误或大小写错误。

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<windows.h>
//链表的操作
typedef struct{//联系人的存储结构 
	long long number;
	char LinkName[20];
}Linkman;

typedef struct LINK{//链表的存储结构 
	Linkman date;
	struct LINK *next;
}Link;

typedef struct HEAD{//链表的头结点的结构
	int LinkLength;
	char LinkFeature[20];
	Link *next;
}Head;
//链表通讯录的创建
Head *CreateLink(){
	Head *head;
	Link *p,*q;
	int i=0;
	head=(Head *)malloc(sizeof(head));
	head->LinkLength=0;
	head->next=NULL;
	printf("请命名该文件:");
	scanf("%s",head->LinkFeature);
	printf("输入“0”退出输入\n"); 
	while(1){
		p=(Link *)malloc(sizeof(Link));
		printf("请输入联系人姓名:");
		scanf("%s",p->date.LinkName );
			if(p->date.LinkName[0]=='0'){
			free(p);
			break;
		}
		printf("请输入联系人号码:");
		scanf("%lld",&p->date.number);
		p->next=head->next;
		head->next=p;
		i++;
	} 
	head->LinkLength=i;
	return head;
}
//输出整个通讯录
void PrintLink(Head *head){
	Link *p;
	p=head->next;
	while(p!=NULL){
		printf("%s\t%lld\n",p->date.LinkName,p->date.number);
		p=p->next;
	} 
}
//按位置插入联系人 
Head *InsertLink(Head *head){
	Link *p,*q;
	int n,i;
	p=head->next;
	q=(Link *)malloc(sizeof(Link));
	q->next=NULL;
	printf("请在下方输入你要插入的联系人信息。\n");
	printf("请输入联系人姓名:");
	scanf("%s",q->date.LinkName );
	printf("请输入联系人号码:");
	scanf("%lld",&q->date.number);
	printf("请输入插入的位置:");
	scanf("%d",&n); 
	if(n>head->LinkLength+1){
		printf("未能插入联系人,请查证你填写的信息。\n");
		return head;
	}
	for(i=1;i<n;i++){
		p=p->next;
	}
	if(n==1){
		q->next=p;
		head->next=q;
	}else{
		if(p!=NULL){
			q->next=p->next;
			p->next=q;
		}else{
			p=q;
		}
	}
	head->LinkLength=head->LinkLength+1;
	printf("成功插入联系人。\n");
	return head;
}
//删除特定的联系人 
Head *DeleteLink(Head *head){
	Link *p,*q;
	p=head->next;
	char name[20];
	printf("请输入你要删除的联系人姓名:");
	scanf("%s",name);
	while(p!=NULL){
		if(strcmp(p->date.LinkName,name)==0){
			break;
		}
		q=p;
		p=p->next;
	} 
	if(p==NULL){
		printf("未能成功删除联系人,请查证你填写的信息。\n");
		return head;
	}else{
		if(p==head->next){
			head->next=p->next;
			free(p);
		}else{
			q->next=p->next;
			free(p);
		}
		printf("成功删除联系人。\n");
		return head;
	}
}
//修改特定的联系人 
Head *ReviseLink(Head *head){
	Link *p,*q;
	p=head->next;
	char name[20];
	printf("请输入你要修改的联系人姓名:");
	scanf("%s",name);
	while(p!=NULL){
		if(strcmp(p->date.LinkName,name)==0){
			break;
		}
		q=p;
		p=p->next;
	} 
	if(p==NULL){
		printf("查无此人\n");
	}else{
		printf("请输入修改后的联系人号码:");
		scanf("%lld",&p->date.number);
		printf("修改成功。\n"); 
		return head;
	} 
}
//查找特定的联系人 
void FindLink(Head *head){
	Link *p,*q;
	p=head->next;
	char name[20];
	printf("请输入你要查找的联系人姓名:");
	scanf("%s",name);
	while(p!=NULL){
		if(strcmp(p->date.LinkName,name)==0){
			break;
		}
		q=p;
		p=p->next;
	} 
	if(p==NULL){
		printf("查无此人\n");
	}else{
		printf("%s\t%lld\n",p->date.LinkName,p->date.number);
	}
}
 
int main(){
	Head *head;
	int a;
	printf("欢迎使用初级通讯录\n");
	printf("你还未创建任何通讯录,请创建一个通讯录\n");
	head=CreateLink();
	printf("接下来你可以对通讯录进行操作了\n");
	while(1){
		Sleep(2000);
		system("cls");
		printf("1----插入新的联系人\n");
		printf("2----删除一个联系人\n");
		printf("3----查证一个联系人\n");
		printf("4----修改一个联系人\n");
		printf("5----查看全部联系人\n");
		printf("输入其他数字退出系统\n");
		printf("请输入你接下来的操作:\n"); 
		scanf("%d",&a);
		if(a==1){
			head=InsertLink(head);
		}else if(a==2){
			head=DeleteLink(head);
		}else if(a==3){
			FindLink(head);
		}else if(a==4){
			ReviseLink(head);
		}else if(a==5){
			PrintLink(head);
		}else{
			break;
		}
	}
	return 0;
}

 


我们的征途是是星辰大海