数据结构的第二个课程设计,在c语言课程设计的基础上加以改进,(加强版),保存一下代码,对文件的处理,还是有一点一问题,还有待改进
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>/*屏幕操作函数库*/
struct node
{
int num; //编号
char name[10];//姓名
char addr[20];//地址
char telenum[20];//电话号码
};
typedef node telebook;
struct Lnode
{
telebook data;
Lnode *next;
};
typedef Lnode Link;
Link *L;//创建头节点
void Find_Num(Link *L);
void Find_Name(Link *L);
void Find_Tel(Link *L);
void DestoryLink(Link *L);
Link *CreatLink(Link* L)//创建
{
Link *q,*p;
FILE *fp;
char flag='y';
int i=0;
L=(Link *)malloc(sizeof(Link)); //创建头节点
q=L;//尾指针指向头指针
if((fp=fopen("telebook.txt","ab+"))==NULL)/* 若读写打开二进制文件telebook.txt失败,则显示出错信息 */
{
printf("打开文件有误!");
exit(0);
}
while(flag=='y')
{
p=(Link *)malloc(sizeof(Link));
printf("录入信息:\n");
printf("编号:\n");
scanf("%d",&p->data.num);
printf("姓名:\n");
scanf("%s",p->data.name);
printf("地址:\n");
scanf("%s",p->data.addr);
printf("电话号码:\n");
scanf("%s",p->data.telenum);
q->next=p;
q=p;
printf("继续添加?(y/n)\n");
scanf("%s",&flag);
while(flag!='y'&&flag!='n')
{
printf("输入错误,请重新输入\n");
scanf("%s",&flag);
i++;
if(i>2)
break;
}
}
fwrite(q,sizeof(Link),1,fp);
fclose(fp);
q->next=NULL;
return L;
}
void InsertLink(Link *L)//插入
{
Link *q,*p;
q=L;
int j=0,i;
printf("输入要插入的位置:\n");
scanf("%d",&i);
while(j<i-1&&q->next!=NULL)//查找第i-1个元素
{
j++;
q=q->next;
}
if(q==NULL)//没有找到第i-1个元素
printf("没有找到要插入的位置!\n");
else
{
p=(Link *)malloc(sizeof(Link));
printf("输入要插入的信息:\n");
printf("编号:\n");
scanf("%d",&p->data.num);
printf("姓名:\n");
scanf("%s",p->data.name);
printf("地址:\n");
scanf("%s",p->data.addr);
printf("电话号码:\n");
scanf("%s",p->data.telenum);
p->next=q->next;
q->next=p;
printf("插入成功!\n");
}
}
void PrintLink(Link *L)//显示
{
Link *p;
p=L;
if(p==NULL||p->next==NULL) //链表为空
printf("您的操作有误,请确保您的通讯录不为空!\n");
else
{
p=L->next;
while(p!=NULL)
{
printf("| 编号 | 姓名 | 电话号码 | 地址 |\n");
printf("|---------|-----------|----------------|--------------