在LINUX下用链表形式编写通讯录(bug已修正版)

昨日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;
}

编程心得:比起利用结构体数组编写通讯录,链表中运用了大量指针,能够复习巩固指针方面的知识,锻炼逻辑思维能力,培养谨慎规范的编程习惯。另外比起结构体数组,链表不需要开辟使用连续的内存空间,对于内存的利用更加有效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值