#define LL sizeof(struct Information)
#include<stdlib.h>
struct Information
{
char name[25]
int number
double Tel_number
struct Information *next
}
int n,t
struct Information *creat()
{
struct Information *head,*p1,*p2
n=0
p1=p2=(struct Information *)malloc(LL)
printf("请输入第 %d 个学生通讯信息:\n",n+1)
scanf("%s%d%lf",p1->name,&p1->number,&p1->Tel_number)
getchar()
head=NULL
while(p1->number!=0)
{
n++
if(n==1)head=p1
else
p2->next=p1
p2=p1
p1=(struct Information *)malloc(LL)
scanf("%s%d%lf",p1->name,&p1->number,&p1->Tel_number)
getchar()
}
p2->历丛枣next=NULL
free(p1)
p1=NULL
return head
}
void output(struct Information *p3)
{
printf("\郑岩n你建立的是多少人的通讯录: n=%d\n ",n)
printf("\n输出存入的通信信息:\n")
printf("\n姓名\t学号\t电话号码\n")
while(p3!=NULL)
{
printf("%s\t%d\t%.0lf\n",p3->name,p3->number,p3->Tel_number)
p3=p3->next
}
}
void file(struct Information *p8)
{
FILE *fp
int i
t=n
if((fp=fopen("Infor.dat","wb"))==NULL)
{
printf("此文件无法打开!\n")
exit(0)
}
for(i=0i<ti++)
{
if(fwrite(&p8->name,LL,1,fp)!=1)
if(fwrite(&p8->number,LL,1,fp)!=1)
if(fwrite(&p8->Tel_number,LL,1,fp)!=1)
p8=p8->next
else
printf("此文件写入错误肢拆\n")
}
fclose(fp)
}
void Insert(struct Information *head,struct Information *node,int num1)
{
struct Information *p
if(head==NULL)
{
head=node
node->next=NULL
n++
printf("你插入后总共有结点:n=%d\n",n)
}
p=head
while(p->number!=num1 &&p->next!=NULL)
{
p=p->next
}
if(p->number==num1)
{
node->next=p->next
p->next=node
n++
printf("你插入后总共有结点:n=%d\n",n)
}
else
printf("\nthe num1 is't found!\n")
printf("\n输出插入一个学生的通讯信息后的通讯录:\n")
printf("\n姓名\t学号\t电话号码\n")
p=head
while(p!=NULL)
{
printf("%s\t%d\t%.0lf\n",p->name,p->number,p->Tel_number)
p=p->next
}
}
void Delete(struct Information *head,int num2)
{
struct Information *p5,*p6,*p7
if(head==NULL)
{
printf("\nthis is a null list!\n")
}
p6=head
while(p6->number!=num2 &&p6->next!=NULL)
{
p5=p6
p6=p6->next
}
if(p6->number==num2)
{
if(head==p6)
{
head=head->next
}
else
p5->next=p6->next
n--
printf("你 删除 后总共有结点:n=%d\n",n)
}
else
printf("\nthe %d didn't been found!\n")
printf("\n输出 删除 一个学生的通讯信息后的通讯录:\n")
printf("\n姓名\t学号\t电话号码\n")
free(p6)
p6=NULL
p7=head
while(p7!=NULL)
{
printf("%s\t%d\t%.0lf\n",p7->name,p7->number,p7->Tel_number)
p7=p7->next
}
}
int main()
{
struct Information *p0,*p4
int r,m
p0=creat()
output(p0)
file(p0)
printf("请输入要 插入 信息:\n")
p4=(struct Information *)malloc(LL)
scanf("%s%d%lf",p4->name,&p4->number,&p4->Tel_number)
getchar()
printf("请输入 插在 那个学号:\n")
scanf("%d",&r)
Insert(p0,p4,r)
printf("请输入 删除 那个学号:\n")
scanf("%d",&m)
Delete(p0,m)
return 0
}
#define N 100#define SIZE 30
#include <stdio.h>
#include <string.h>
#include <conio.h>
struct student{
char num[SIZE]
char name[SIZE]
char tel[SIZE]
}
/*函数声明*/
void 空御myprint()/*显示菜单*/
int mycreat(struct student*p,int n)/*输入通讯录*/void mydisplay(struct student*p,int n)/*显示通讯录*/void mysearch(struct student*p,int n)/*查找*/
void mymodify(struct student*p,int n)/*修改通讯录*/int myadd(struct student*p,int n)/*增加通讯录*/int mydelete(struct student*p,int n)/*删除*/void mysort(struct student*p,int n)/*排序*/
void sch_num(struct student*p,int n)/*按学号查找*/void 谈伍sch_name(struct student*p,int n)/*按姓名查找*/
int loadinfo(struct 斗侍岩student*p,int n)/*载入通讯录信息*/int saveinfo(struct student*p,int n)/*保存通讯录信息*/void main(){
/*文件定义*/char choose,yes_no
struct studentrecord[N]/*存放通讯录信息,共100条*/int total=0,flag/*通讯录总数*/
total=loadinfo(record,N)/*从文件读取记录信息,不超过100条*/do{
myprint()/*显示菜单*/
printf("请选择:")do{
choose=getchar()}
while(choose<'0'||choose>'9')switch(choose){
case'1':
total=mycreat(record,total)breakcase'2':
mydisplay(record,total)breakcase'3':
mysearch(record,total)breakcase'4':
mymodify(record,total)breakcase'5':
total=myadd(record,total)breakcase'6':
total=mydelete(record,total)breakcase'7':
mysort(record,total)breakcase'8':
flag=saveinfo(record,total)if(flag==1)
printf("\n保存成功!\n")else
printf("\n保存失败!\n")breakcase'0':
breakdefault:
printf("\n%c为非法选项!\n",choose)}
if(choose=='0')breakprintf("\n要继续选择吗(Y/N)?")do{
yes_no=getchar()}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n')}
while(yes_no!='Y'||yes_no!='y')}
void myprint()/*显示菜单信息*/{
printf("\n\n\n\n\n")printf("\n")printf("请输入选项编号(0--7)\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("0---退出\n")printf("\n")
}
int mycreat(struct student*p,int n)/*批量输入学生信息*/{
int i=0int m
printf("添加前的记录,共有<%d>个:\n",n)printf("\n记录号学号姓名电话号码\n")
i=0
while((i<n)&&(strcmp(p->num,"")!=0)){
printf("%d:%15s%15s%15s\n",i+1,p->num,p->name,p->tel)i++p++}
printf("\n请输入要输入的学生人数(<%d):",N-n)
scanf("%d",&m)i=0
while(i<m){
printf("\n")
printf("请输入第%d个记录:\n",i+1)printf("学号:")do{
gets(p->num)}
while(strcmp(p->num,"")==0)printf("姓名:")gets(p->name)
printf("电话号码:")gets(p->tel)p++i++}
return m+n}
void mydisplay(struct student*p,int n)/*显示学生信息*/{
/*clrscr()*/int i=0
printf("\n记录号学号姓名电话号码\n")while(i<n){
printf("%d:%15s%15s%15s\n",i+1,p->num,p->name,p->tel)p++i++}}
void mymodify(struct student*p,int n)/*修改学生信息*/{
int i
char nam[10]mydisplay(p,n)
printf("\n请输入要修改记录的姓名:")gets(nam)
for(i=0i<ni++,p++)
if(strcmp(nam,p->name)==0)breakif(i==n)
printf("无此人!\n")else{
printf("请输入正确的学号:")do{
gets(p->num)}
while(strcmp(p->num,"")==0)printf("请输入正确的姓名:")gets(p->name)
printf("请输入正确的电话号码:")gets(p->tel)}
}
void mysearch(struct student*p,int n)/*查找指定学生*/{
char c
mydisplay(p,n)
printf("\n按学号查询(h),还是按姓名查询(m)?")c=getchar()
if(c=='h'||c=='H')
sch_num(p,n)else if(c=='m'||c=='M')
sch_name(p,n)else
printf("\n非法字符!\n")}
void sch_num(struct student*p,int n)/*按学号查询*/{
int i,flag=0char nm[10]
printf("\n请输入要查询记录的学号:")gets(nm)
for(i=0i<ni++)
if(strcmp(nm,p[i].num)==0)
{
printf("\n学号姓名电话号码\n")printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)flag=1
}
if(flag==0)
printf("无此人!\n")}
void sch_name(struct student*p,int n)/*按姓名查询*/{
int i,flag=0char nam[10]
printf("\n请输入要查询记录的姓名:")gets(nam)
for(i=0i<ni++)
if(strcmp(nam,p[i].name)==0){
printf("\n学号姓名电话号码\n")printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)flag=1}
if(flag==0)
printf("无此人!\n")
}
int myadd(struct student*p,int n)/*增加学生信息*/{
int i=0char c
struct studentt,*q
printf("添加前的记录:\n")printf("\n学号姓名电话号码\n")i=0q=p
/*显示原有记录信息*/while(i<n){
printf("%15s%15s%15s\n",q->num,q->name,q->tel)i++q++}do{
printf("请输入新记录的学号:\n")do{
gets(t.num)
}
while(strcmp(t.num,"")==0)/*学号不能为空*/printf("请输入新记录的姓名:")gets(t.name)
printf("请输入新记录的电话号码:")gets(t.tel)
for(i=0i<ni++)
if(strcmp(t.num,(p+i)->num)==0||strcmp(t.tel,(p+i)->tel)==0){
printf("学号或电话号码重,要重新输入吗(Y/N)?")c=getchar()putchar ('\n')break}
/*找到最后,没有重复*/if(i==n){
*(p+i)=t
printf("添加后的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<n+1i++)
printf("%15s%15s%15s\n",(p+i)->num,(p+i)->name,p[i].tel)break}
}
while(c=='y'||c=='Y')return n+1}
int mydelete(struct student*p,int n)/*删除学生信息*/{
int i,x
char c,nm[10],nam[10]
printf("删除前的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)printf("按学号删除(h),还是按姓名删除(m)?")c=getchar()
if(c=='h'||c=='H'){
printf("\n请输入要删除记录的学号:")gets(nm)
for(x=0x<nx++)
{
gets(t.num)
}
while(strcmp(t.num,"")==0)/*学号不能为空*/printf("请输入新记录的姓名:")gets(t.name)
printf("请输入新记录的电话号码:")gets(t.tel)
for(i=0i<ni++)
if(strcmp(t.num,(p+i)->num)==0||strcmp(t.tel,(p+i)->tel)==0){
printf("学号或电话号码重,要重新输入吗(Y/N)?")c=getchar()putchar ('\n')break}
/*找到最后,没有重复*/if(i==n){
*(p+i)=t
printf("添加后的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<n+1i++)
printf("%15s%15s%15s\n",(p+i)->num,(p+i)->name,p[i].tel)break}
}
while(c=='y'||c=='Y')return n+1}
int mydelete(struct student*p,int n)/*删除学生信息*/{
int i,x
char c,nm[10],nam[10]
printf("删除前的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)printf("按学号删除(h),还是按姓名删除(m)?")c=getchar()
if(c=='h'||c=='H'){
printf("\n请输入要删除记录的学号:")gets(nm)
for(x=0x<nx++)
int j,i,kchar c1,c2
struct studenttemp
printf("\n排序前的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)printf("\n按学号排序(h),还是按姓名排序(m)?")c1=getchar()
if(c1=='h'||c1=='H'){
printf("\n按升序排序(s),还是按降序排序(j)?")c2=getchar()/*升序*/
if(c2=='s'||c2=='S'){
for(i=0i<n-1i++){
k=i
for(j=ij<nj++)
if(strcmp(p[k].num,p[j].num)<0)
k=j
temp=p[k]p[k]=p[i]p[i]=temp
}
printf("\n排序后的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)}
else if(c2=='j'||c2=='J')/*降序*/{
for(i=0i<n-1i++){
k=i
for(j=0j<nj++)
if(strcmp(p[k].num,p[j].num)<0)
k=j
temp=p[k]p[k]=p[i]p[i]=temp
}
printf("排序后的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)}
else printf("\n非法字符\n")}
else if(c1=='m'||c1=='M')/*按姓名排序*/{
printf("\n按升序排序(s),还是按降序排序(j)?")c2=getchar()
if(c2=='s'||c2=='S'){
for(i=0i<n-1i++){
k=i
for(j=0j<nj++)
if(strcmp(p[k].name,p[j].name)<0)
k=j
temp=p[k]p[k]=p[i]p[i]=temp}
printf("排序后的记录:\n")printf("\n学号姓名电话号码\n")for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)
}
else if(c2=='j'||c2=='J')/*降序*/{
for(i=0i<n-1i++){
k=i
for(j=ij<nj++)
if(strcmp(p[k].name,p[j].name)<0)
k=j
temp=p[k]p[k]=p[i]p[i]=temp
}
printf("排序后的记录:\n")printf("\n学号
姓名电话号码\n")
for(i=0i<ni++)
printf("%15s%15s%15s\n",p[i].num,p[i].name,p[i].tel)}
else printf("\n非法字符!\n")}
else printf("\n非法字符!\n")}
int loadinfo(struct student*p,int n)/*载入通讯录信息*/{
FILE*fpint i,all=0
char filename[30]="tongxunlu.txt"fp=fopen(filename,"r")if(fp==NULL){
printf("\n***不能打开文件%s,或%s文件不存在,创建一个新文件!
",filename,filename)*/
fp=fopen(filename,"w")}
fscanf(fp,"%d\n",&all)
if(all>N)/*读取记录总数*/{
printf("文件记录数太多,不能读取")return 0}
for(i=0i<alli++)/*读取记录信息*/{
fscanf(fp,"%s%s%s\n",p[i].num,p[i].name,p[i].tel)}
fclose(fp)/*关闭文件*/return all}
int saveinfo(struct student*p,int n){
FILE*fpint i,all=0
char filename[30]="txl.dat"/*文件可以用记事本打开*/fp=fopen(filename,"w")if(fp==NULL){
printf("\n***不能建立或打开文件%s!***",filename)return 0}
fprintf(fp,"%d\n",n)for(i=0i<ni++)
fprintf(fp,"%s%s%s\n",p[i].num,p[i].name,p[i].tel)fclose(fp)return 1}
抄来的
这是我以前写的课程设计,电子通讯录功能如下:
Function choose
1.Read
2.Append
3.Delete
4.Search
5.Save and exit
6.Quit
说明:上图是电子通讯录的主菜单,利用它,将能够轻松地录入一个朋友的电话号
码,通讯地址和出生日期,而且它还提供了检索和删除功能。在后面还将提供按生
日先后排序的功能,这些都有助于该通讯录的管理。
电子通讯录是采用线性表作为程序的基本结构的。
设计思想:
1。用顺序表设计电子通讯录的结链隐猛构
为了表示较为复杂的数据内容,一般用结构这种数据类型,第一步就是在结构中定
义所需要的各项信息。
一般的通讯录都包括姓名,性别,出生年月,通讯地址和联系电话这几项,而
在这几项中,出生年月又包括年份,月份和日期三项,通讯地址包括邮编和家庭地
址二项,我们把这些联系较为紧密的内容又用单独的结构表示,这样就产生了电子
通讯录的基本结构:
struct addr /*通讯地址结构定义*/
{ char post_num[10]/*邮编*/
char addr[40]/*家庭地址*/
}
struct birth /*出生年月结构定义*/
{ int year/*年份*/
int month/*月份*/
int day/*日期*/
}
struct friend /*电子通讯录结构定义*/
{ int number/*序号*/
char name[20] /*姓名*/
char sex/*性别*/
struct birth birth/*出生年月*/
struct addr addr/*通信地址*/
char telephone[13]/*联系电话*/
}
定义的主结构friend包含了前述的五项携稿内容 name,sex,和telephone分别代表
了姓名,性别和联系电话。为了让结构中的各项组分更加清晰,定义了二个
小结构birth 和addr分别代表出生年月和通讯地址,因此实际上friend包含了
8项内容。
有了结构定义后,我们可以很轻松地构造出电子通讯录的主体:
stryct friend friends[50]
采用一维数组 friends[50],正是用到了顺序表这种最简单的数据结构来表示
问题。
2.增添电子通讯录中的内容
对于电子通讯录这样一张顺序表来说,内容的录入是必不可少的 *** 作。由
于采用的是顺序存储结构。这项工作很简单,只需要在把输入的信息按顺序放
在空的friends数组元素中即可。函数Data_Input完成了信息的录入工作:
void Data_input(int j)
{
friends[j].number=j
printf("\n\n\n\tNo %d record",j)
printf("\n\n\tName:")/*读入姓名*/棚桥
scanf("%s",friends[j].name)
printf("\n\tSex(m/f):")/*读入姓别*/
scanf("%c",&friends[j].sex)
printf("\n\tbirthday:")/*读入出生年月*/
printf("\n\t\tyear:")
scanf("%d",&friends[j].birth.year)
printf("\n\t\tmonth")
scanf("%d",&friends[j].birth.month)
printf("\n\t\tday")
scanf("%d",&friends[j].birth.day)
printf("\n\tPost number:")/*读入邮编*/
scanf("%s",friends[j].addr.post_num)
printf("\n\tAddress:")/*读入家庭地址*/
scanf("%s",friends[j].addr.addr)
printf("\n\ttelephone:")/*读入联系电话*/
scanf("%s",friends[j].telephone)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)