昨日bug 部分
stu *myread(stu *head)//这个函数有bug
{
FILE *stream;
stream=fopen("/root/Desktop/addresslist_lb/data","r");
int count1,i,k;
char new1[10];
stu *temp=head;
if(stream==NULL)
{
printf("打开文件失败");
}
else
{
printf("ok ");
fread(&count1,sizeof(int),1,stream);
for(i=0;i<count1;i++)
{
stu *a=(stu*)malloc(sizeof(stu));
fread(a,(sizeof(stu)-4),1,stream);
a->next=NULL;
temp->next=a;
temp=temp->next;
}
}
fclose(stream);
return head;
}
解决方法:通过读取文件中的第一个字符用feof函数判断文件是否为空,若不为空则feof函数返回一个0值,读取data文件中存储的信息。
所有功能源代码
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
//#include<Windows.h>
typedef struct Link
{
int num;
char name[10];
char sex[10];
char address[10];
char tel[10];
struct Link *next;
}stu;
stu *mywrite(stu *head);
stu *myread(stu *read);
int mystrlen(stu *head)//链表长度计算函数
{
int count=0;
stu *temp = head;
while (temp->next!=NULL)
{
count++;
temp = temp->next;
}
return count;
}
void display(stu *head) //显示函数
{
int count;
int i;
int a[10];
stu *temp = head;
count=mystrlen(head);
for(i=0;i<count;i++)
{
a[i]=i+1;
}
i=0;
while (temp->next!=NULL)
{
//printf("%d ",mystrlen(head));
// temp->next->num=i;
printf("%d ",a[i]);
printf("序号为:%d ",temp->next->num);
printf("名字为:%s ",temp->next->name);
printf("性别为:%s ",temp->next->sex);
printf("地址为:%s ",temp->next->address);
printf("电话号码为:%s ",temp->next->tel);
printf("\n");
i++;
temp = temp->next;
}
}
stu *tailinput(stu *head)//尾插法
{
char new1[10];
stu *temp=head;
stu *a = (stu*)malloc(sizeof(stu));
if(a==NULL)
{
printf("malloc falure\n");
}
else
{
while(temp->next!=NULL)
{
temp = temp->next;
}
a->next = NULL;
temp->next = a;
printf("请输入姓名:");
scanf("%s",new1);
strcpy(a->name,new1);
strcpy(new1,"");
printf("请输入性别:");
scanf("%s",new1);
strcpy(a->sex,new1);
strcpy(new1,"");
printf("请输入地址:");
scanf("%s",new1);
strcpy(a->address,new1);
strcpy(new1,"");
printf("请输入号码:");
scanf("%s",new1);
strcpy(a->tel,new1);
strcpy(new1,"");
a->num=mystrlen(head);
printf("插入成功\n");
}
return head;
}
stu *headinput(stu *head)//头插法
{
char new1[10];
stu *temp=head;
stu *a = (stu*)malloc(sizeof(stu));
if(a==NULL)
{
printf("malloc falure\n");
}
else
{
a->next = head->next;
head->next = a;
a->num=mystrlen(head);
printf("请输入姓名:");
scanf("%s",new1);
strcpy(a->name,new1);
strcpy(new1,"");
printf("请输入性别:");
scanf("%s",new1);
strcpy(a->sex,new1);
strcpy(new1,"");
printf("请输入地址:");
scanf("%s",new1);
strcpy(a->address,new1);
strcpy(new1,"");
printf("请输入号码:");
scanf("%s",new1);
strcpy(a->tel,new1);
strcpy(new1,"");
printf("插入成功\n");
}
return head;
}
stu *input(stu *head)//中插法
{
int index,i,count=0;
char new1[10];
stu *temp=head;
display(head);
printf("请选择在第几个位置插入:");
scanf("%d",&index);
count =mystrlen(head);
if(index>=0&&(index-1)<=count)
{
stu *a = (stu*)malloc(sizeof(stu));
if(a==NULL)
{
printf("malloc falure\n");
}
else
{
printf("请输入姓名:");
scanf("%s",new1);
strcpy(a->name,new1);
strcpy(new1,"");
printf("请输入性别:");
scanf("%s",new1);
strcpy(a->sex,new1);
strcpy(new1,"");
printf("请输入地址:");
scanf("%s",new1);
strcpy(a->address,new1);
strcpy(new1,"");
printf("请输入号码:");
scanf("%s",new1);
strcpy(a->tel,new1);
strcpy(new1,"");
for(i=0;i<(index-1);i++)
{
temp = temp->next;
}
a->next = temp->next;
temp->next = a;
a->num=mystrlen(head);
printf("插入成功\n");
}
}
else
{
printf("插入位置有误\n");
}
return head;
}
stu *delate(stu *head)//删除函数
{
int del=0,count,i;
stu *temp=head;
display(head);
printf("请选择要删除第几个数据:");
scanf("%d",&del);
count =mystrlen(head);
if(del>=0&&(del-1)<=count)
{
for(i=0;i<(del-1);i++)
{
temp = temp->next;
}
stu *delt=temp->next;
temp->next=delt->next;
free(delt);
}
else
{
printf("删除位置有误\n");
}
return head;
}
stu *change(stu *head)//修改功能
{
int chg=0,count,par,i,tar;
char new1[10];
stu *temp=head;
display(head);
printf("请选择要修改的第几个信息:");
scanf("%d",&chg);
count =mystrlen(head);
if(chg>=0&&(chg)<=count)
{
for(i=0;i<(chg);i++)
{
temp = temp->next;
}
printf("请选择要修改的信息:1.姓名 2.性别 3.地址 4.号码 5.返回主菜单");
scanf("%d",&par);
if(par==1)
{
pp1:printf("请输入新姓名:");
scanf("%s",new1);
printf("新姓名为:%s\n",new1);
printf("确认请按1,重新输入请按2:\n");
printf("请输入;");
scanf("%d",&tar);
if(tar==1)
{
strcpy(temp->name,new1);
strcpy(new1,"");
}
else if(tar==2)
{
goto pp1;
}
else
{
printf("输入错误");
}
}
else if(par==2)
{
pp2:printf("请输入新性别:");
scanf("%s",new1);
printf("新性别为:%s\n",new1);
printf("确认请按1,重新输入请按2:\n");
printf("请输入;");
scanf("%d",&tar);
if(tar==1)
{
strcpy(temp->sex,new1);
strcpy(new1,"");
}
else if(tar==2)
{
goto pp2;
}
else
{
printf("输入错误");
}
}
else if(par==3)
{
pp3:printf("请输入新地址:");
scanf("%s",new1);
printf("新地址为:%s\n",new1);
printf("确认请按1,重新输入请按2:\n");
printf("请输入;");
scanf("%d",&tar);
if(tar==1)
{
strcpy(temp->address,new1);
strcpy(new1,"");
}
else if(tar==2)
{
goto pp3;
}
else
{
printf("输入错误");
}
}
else if(par==4)
{
pp4:printf("请输入新号码:");
scanf("%s",new1);
printf("新号码为:%s\n",new1);
printf("确认请按1,重新输入请按2:\n");
printf("请输入;");
scanf("%d",&tar);
if(tar==1)
{
strcpy(temp->tel,new1);
strcpy(new1,"");
}
else if(tar==2)
{
goto pp4;
}
else
{
printf("输入错误");
}
}
else if(par==5)
{
}
else
{
printf("输入错误");
}
}
else
{
printf("修改位置有误\n");
}
return head;
}
stu *search(stu *head)
{
char new1[10];
int par=0;
stu *temp=head;
printf("请输入查找方式1.按姓名查找 2.按号码查找 3.返回主菜单\n");
printf("请输入:");
scanf("%d",&par);
if(par==1)
{
printf("请输入要查找的姓名:");
scanf("%s",new1);
temp =head;
while (temp->next!=NULL)
{
if(strcmp(new1,temp->next->name)==0)
{
printf("查找成功\n");
printf("%s ",temp->next->name);
printf("%s ",temp->next->sex);
printf("%s ",temp->next->address);
printf("%s ",temp->next->tel);
printf("\n");
break;
}
temp = temp->next;
}
if(temp->next==NULL)
{
printf("未找到相关信息\n");
}
strcpy(new1,"");
}
else if(par==2)
{
temp =head;
printf("请输入要查找的号码:");
scanf("%s",new1);
while (temp->next!=NULL)
{
if(strcmp(new1,temp->next->tel)==0)
{
printf("查找成功\n");
printf("%s ",temp->next->name);
printf("%s ",temp->next->sex);
printf("%s ",temp->next->address);
printf("%s ",temp->next->tel);
printf("\n");
break;
}
temp = temp->next;
}
if(temp->next==NULL)
{
printf("未找到相关信息\n");
}
strcpy(new1,"");
}
else if(par==3)
{
}
else
{
printf("输入错误\n");
}
return head;
}
int main()
{
head->next = NULL;
stu *temp=head;
int flag=1;
int count,i;
myread(head);
while(flag)
{
int a=0;
printf("****************************\n");
printf("************功能************\n");
printf(" 1. 显示通讯录 \n");
printf(" 2. 往尾部添加添加新信息 \n");
printf(" 3. 往头部添加添加新信息 \n");
printf(" 4. 往中部添加添加新信息 \n");
printf(" 5. 删除信息 \n");
printf(" 6. 查找信息 \n");
printf(" 7. 修改信息 \n");
printf(" 8. 结束功能 \n");
printf("****************************\n");
printf("请选择功能(1~8):");
scanf("%d",&a);
switch(a)
{
case 1:display(head);
break;
case 2:tailinput(head);
break;
case 3:headinput(head);
break;
case 4:input(head);
break;
case 5:delate(head);
break;
case 6:search(head);
break;
case 7:change(head);
break;
case 8:
flag=0;
//Sleep(0.5);
break;
default :printf("输入错误\n");break;
}
}
mywrite(head);
}
stu *myread(stu *head)
{
FILE *stream;
stream=fopen("/root/Desktop/addresslist_lb/data","r");
int count1,i,k;
char new1[10];
stu *temp=head;
if(stream==NULL)
{
printf("打开文件失败");
}
else
{
fgetc(stream);
if(feof(stream)==0)
{
printf("ok1");
fseek(stream,0,0);
printf("ok ");
fread(&count1,sizeof(int),1,stream);
for(i=0;i<count1;i++)
{
stu *a=(stu*)malloc(sizeof(stu));
fread(a,(sizeof(stu)-4),1,stream);
a->next=NULL;
temp->next=a;
temp=temp->next;
}
}
}
fclose(stream);
return head;
}
stu *mywrite(stu *head)
{
int count;
stu *temp=head;
FILE *stream;
stream=fopen("/root/Desktop/addresslist_lb/data","w");
if(stream==NULL)
{
printf("打开文件失败");
}
else
{
temp=temp->next;
count=mystrlen(head);
fwrite(&count,4,1,stream);
while(temp!=NULL)
{
fwrite(temp,(sizeof(stu)-4),1,stream);
temp=temp->next;
}
}
return head;
}
编程心得:比起利用结构体数组编写通讯录,链表中运用了大量指针,能够复习巩固指针方面的知识,锻炼逻辑思维能力,培养谨慎规范的编程习惯。另外比起结构体数组,链表不需要开辟使用连续的内存空间,对于内存的利用更加有效。