| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 401 人关注过本帖
标题:这个程序链接有错,应该怎么改呢?
只看楼主 加入收藏
吴妹
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-8-14
收藏
 问题点数:0 回复次数:0 
这个程序链接有错,应该怎么改呢?


#ifndef _H_LETTER_H_A
#define _H_LETTER_H_A

#include<stdio.h>/*使用输入输出函数*/
#include<stdlib.h>/*动态存储分配所需的头文件*/
#include<ctype.h>/*使用字符分类函数*/
#include<string.h>/*使用字符串函数*/

/*通讯录结构体*/
typedef struct address
{
char name[18];
char tel[20];
char num[20];
char clas[10];
char home[30];
struct address *next;
}ADDR;


#define LEN sizeof(ADDR)

extern int count;//声明全局记录计数变量
extern int savedTag;//记录是否保存过的标志


/*函数的声明*/
ADDR *slstore(ADDR *);/*增加记录*/
void display(ADDR *);/*显示记录*/
void save(ADDR *);/*保存记录*/
ADDR *load(void);/*读取记录*/
int menu_select(void);/*菜单选择*/
void handle_menu(ADDR *);/*菜单处理*/
ADDR *delete_record(ADDR *);/*删除记录*/
void free_nodes(ADDR *);/*释放存储空间*/
void quit(ADDR *);/*结束运行*/
ADDR* new_addrBook(ADDR *);/*新建通讯录*/
void find_record(ADDR *);/*查询记录*/
void sort(char *name[],int);/*排序*/

#endif //_H_LETTER_H_A

int count;
int savedTag = 0;

void main()
{
printf("\n");
printf("\t****************************\n");
printf("\t* 这是一个 *\n");
printf("\t* 简单的通讯录程序 *\n");
printf("\t* 可以对通讯录进行简单管理 *\n");
printf("\t* 欢迎使用通讯录 *\n");
printf("\t****************************\n");
printf("\n");

count=0;
handle_menu(NULL);
}

//菜单处理函数
void handle_menu(ADDR *top)
{
for( ; ; )
{
switch(menu_select())
{
case 1:top = slstore(top);
break;
case 2:display(top);
break;
case 3:save(top);
break;
case 4:free_nodes(top);//首先释放原来链表所占用的内存
top = load();
break;
case 5:top = delete_record(top);
break;
case 6:top = new_addrBook(top);
break;
case 7:find_record(top);
break;
case 8:quit(top);
}
}
}

//菜单选择函数
int menu_select()
{
char s[2];
int cn=0;
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左边数字对应功能选择,请选1-8:");

for( ; ; );
{
/*不管用户按数字键还是按字母键,语句“gets(s)”都能将输入作为字符串接收,
然后语句“cn = atoi (s);”再将所接收的字符串转成数值,提供给if语句判别。*/
gets(s);
cn = atoi (s);
if(cn<1 || cn>8)
printf("\n输入错误,重选1-8:");

}
return cn;
}
/*****************************
*释放以top为头部的链表的内存空间
*参数top:当前通讯录链表的表头
*****************************/
void free_nodes(ADDR *top)
{
ADDR *p=top;
ADDR *old=p;
while (p) //未到表尾
{
old=p;
p=p->next;
free(old);
}
count=0; //释放后开始重新计数
}

/*********************************
*结束运行,退出
*参数top:当前通讯录链表的表头
*********************************/
void quit(ADDR*top)
{
char str[10];
if (savedTag == 1)//已改动,未保存
{
printf("通讯录已改动,是否保存?(Y/n)\n");
gets(str);
if(str[0]=='Y' || str[0]=='y' || str[0]=='\0' )
save(top);
}
printf("退出操作,再见!\n");
free_nodes(top);
exit(0);
}
/******************************
*新建通讯录
*参数 top:当前通讯录链表的表头
*返回 新建通讯录的链表的表头
******************************/
ADDR* new_addrBook(ADDR* top)
{
char str[10];
if(savedTag ==1)//已改动,未保存
{
printf("通讯录已改动,是否保存?(Y/n)\n");
gets(str);
if(str[0]=='Y' || str[0]=='y' || str[0]=='\0' )
save(top); //保存原来通讯录
}
free_nodes(top); //释放原来通讯录所占用的内存空间
top = NULL;
top = slstore(top); //插入新的记录
return top;
}


/**********************************
*输入信息函数
*参数 top:当前通讯录链表的表头
*返回 读取记录后的链表
***********************************/
/*可以多次选择这个菜单进行输入,
如果已经取入 一个文件,则追加在其尾部。*/
ADDR *slsotre(ADDR *top)
{

ADDR *old,*star;

//ASK(star);

do
{
star = (ADDR*)malloc(sizeof(ADDR));
if (star==NULL)
{
printf("Cannot open memory!"); exit(-1);
}
}while(0);


if(top!=NULL) //目前有记录
{
//到达已有记录的底端
old = top;
while(old->next!=NULL)
{
old=old->next;
}
}
else
{ //将第一条记录赋于top
old = top = star;
}

//输入新记录
printf("输入数据,输入0时结束。\n");
--count;
do
{
++count;
printf("姓名");
gets(star->name);
//如果输入的姓名为“0”,则结束添加记录的操作
if(strcmp(star->name,"0")==0)
break;
printf("电话");
gets(star->tel);

printf("编号");
gets(star->num);

printf("班级");
gets(star->clas);

printf("家庭住址");
gets(star->home);

if(top!=star) //不是表头则连接到表尾
{
old->next=star;
old =star;
}
//ASK(star);

do
{
star = (ADDR*)malloc(sizeof(ADDR));
if (star==NULL)
{
printf("Cannot open memory!"); exit(-1);
}
}while(0);


}while(1);

savedTag = 1; //记录已改动,未保存
if(top == star) //说明没有加入一条记录
{
top =NULL;
savedTag = 0;
}
else
old->next=NULL;
free(star);
return (top);
}
/********************************
*显示信息函数
*参数 top:当前通讯录链表的表头
********************************/
void display(ADDR *top)
{
ADDR *p;
char *bname[100];
int i,m;
if(top == NULL)
{
printf("\n现在没有记录!\n");
return ;
}
p=top;
while(p!=NULL)
{
for(i=0;i<100;i++)
{
bname[i]=p->name;
p=p->next;
}
}
m=sizeof(bname)/sizeof(char *);//字符串的个数
sort(bname,m);
p=top;
printf("\n现在共有如下条记录:\n,count");
printf("姓名\t电话\t编号\t班级\t家庭住址\n");
while(p!=NULL)
{
for(i=0;i<m;i++)
{
bname[i]=p->name;
printf("%s/t%s/t%s/t%s/t%s/n",p->name,p->tel,p->num,p->clas,p->home);
p=p->next;
}
}
}
/***********
*选择排序
***********/
void sort(char *name[],int n)
{
char *t;
int i,j,k; //k记录每趟最小值下标
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)
k=j; //第j个元素更小
if(k!=i)
{
t=name[i];
name[i]=name[k];
name[k]=t;
}
}
}


/********************************
*文件存储操作函数
*参数 top:当前通讯录链表的表头
********************************/
void save(ADDR *top)
{
ADDR *p;
FILE *fp;
char fname[20];

if(top == NULL)
{
printf("没有记录可存!");
return ;
}

printf("请输入要存入的文件名(直接回车选择文件sname):\n");
gets(fname);
if(strlen(fname) == 0) //直接回车选择文件sname
strcpy(fname,"sname");
if((fp=fopen(fname,"w"))==NULL)
{
printf("不能存入文件!\n");
return ;
}

printf("\n存文件...\n");
p=top;
while(p)
{
fwrite(p,LEN,1,fp);//向文件fp中写入1个长度为LEN的字符串,字符串在p中
p=p->next;
}
fclose(fp);
printf("%d条记录已经存入文件,请继续操作.\n",count);
savedTag = 0;
}
/********************************
*文件读取操作函数
*参数 top:当前通讯录链表的表头
*返回 读取记录后链表
********************************/
ADDR *load(void)
{
FILE *fp;
ADDR *p,*old,*top;
char fname[20];
count=0;
printf("请输入要读取的文件名(直接回车选择文件sname):\n");
gets(fname);
if(strlen(fname) == 0) //直接回车选择文件sname
strcpy(fname,"sname");
if((fp=fopen(fname,"r"))==NULL)
{
printf("打不开文件!请重新选择\n");
return NULL;
}

printf("\n读文件...\n");
//ASK(p);

do
{
p = (ADDR*)malloc(sizeof(ADDR));
if (p==NULL)
{
printf("Cannot open memory!"); exit(-1);
}
}while(0);


top=p;
old=top;
while(!feof(fp)) //检查文件指针是否在结束位置
{
if(1!=fread(p,LEN,1,fp)) break;//是否有记录可读
count=count+1;
//ASK(p->next);

do
{
p->next = (ADDR*)malloc(sizeof(ADDR));
if (p->next==NULL)
{
printf("Cannot open memory!"); exit(-1);
}
}while(0);


old=p;
p=p->next;
}
old->next=NULL;
fclose(fp);
printf("取入%d条记录.",count);
return(top);
}

/********************************
*查询指定记录
*参数 top:当前通讯录链表的表头
*无返回值
********************************/
void find_record(ADDR *top)
{
char choose[5],input[30];
int cn=0;
ADDR *old,*star;
if(count==0)
{
printf("记录是空表,退出查询操作!");
return ;
}
printf("可以通过姓名或电话查询\n");
printf("1.通过姓名\n");
printf("2.通过电话\n");
gets(choose);
while(1)
{
cn = atoi(choose);
if(cn != 1 && cn != 2)
{
printf("输入错误,重选1-2:");
gets(choose);
}
else
break;
}
switch(cn)
{
case 1:printf("请输入姓名:");
break;
case 2:printf("请输入电话:");
}
gets(input);

old = star = top;
while(star!=NULL)
{
if((cn == 1 && strcmp(input, star->name)==0)
|| (cn ==2 && strcmp(input,star->tel)==0))
{
printf("查询完整信息如下\n"); //给出查询信息
printf("姓名\t电话\t编号\t班级\t家庭住址\n");

printf("%s/t%s/t%s/t%s/t%s/n",star->name,star->tel,star->num,star->clas,star->home);

return ;
}
else
{
old = star;
star =star->next;
}
}
printf("没有找到相应的记录.");

return ;
}


/********************************
*删除指定记录
*参数 top:当前通讯录链表的表头
*返回 删除记录后链表
********************************/
ADDR *delete_record(ADDR *top)
{
char choose[5],input[30];
int cn=0;
ADDR *old,*star;
if(count==0)
{
printf("记录已经为空表,退出删除操作!");
return top;
}
printf("可以通过姓名或电话删除记录\n");
printf("1.通过姓名\n");
printf("2.通过电话\n");
gets(choose);
while(1)
{
cn = atoi(choose);
if(cn != 1 && cn != 2)
{
printf("输入错误,重选1-2:");
gets(choose);
}
else
break;
}
switch(cn)
{
case 1:printf("请输入姓名:");
break;
case 2:printf("请输入电话:");
}
gets(input);

old = star = top;
while(star!=NULL)
{
if((cn == 1 && strcmp(input, star->name)==0)
|| (cn ==2 && strcmp(input,star->tel)==0))
{
if(star == top)
top =star->next;
else
{
printf("将被删除的信息如下\n"); //给出被删除信息
printf("姓名\t电话\t编号\t班级\t家庭住址\n");

printf("%s/t%s/t%s/t%s/t%s/n",star->name,star->tel,star->num,star->clas,star->home);
old->next = star->next;
free(star);
printf("delete it.");//给出删除成功的信息
--count; //调整计数器
return top;
}
}
else
{
old = star;
star = star->next;
}
}
printf("没有找到相应的记录.");
return top;
}




搜索更多相关主题的帖子: 程序链接 
2007-08-14 14:38
快速回复:这个程序链接有错,应该怎么改呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017588 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved