暑假用了三天写的C语言课程设计———学生通讯录 ,还有待完善,就暂且称为1.0版本吧(初具功能,但有缺陷)。
使用的开发软件是 C/C++程序设计学习与试验系统,这个开发软件感觉还不错,支持C++还有中文显示,并且里面还有大量的习题。不过如果想要是自己的编程更加规范,还是TC++3.0比较好。
学生通讯录 主要用到的知识点主要是链表的操作如:建立链表、删除链表、插入链表、查找链表等
#include<stdio.h>
#include<windows.h>
#include<conio.h>
/*预定义*/
#define MAX 50
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
/*结构体定义*/
typedef struct address
{
char num[20];
char name[20];
char phone[25];
struct address *next; /*结构体指针*/
};
/*全局变量*/
FILE *fp,*pf; /*文件指针*/
struct address * head;
int i=0; /*计算信息个数*/
/*函数声明*/
void gotoxy(int x,int y); /*光标定位函数*/
struct address* create(void);
int print(struct address *head);
int search(struct address *head);
struct address *insert(struct address *head);
struct address *dele(struct address *head);
struct address *sort(struct address *head);
int save(struct address *head);
struct address * load(void);
void gotoxy(int x,int y) /*光标定位函数*/
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
/*建立链表函数*/
struct address* create(void) /*()里返回类型可以是void或者struct address * head*/
{ /*之所以要返回是因为其他函数要用到头指针*/
int flag1=0;
char ch;
struct address *p,*q;
system("cls");
i=0;
if(!(p=q=(struct address*)malloc(sizeof(struct address))))
{
printf("内存分配出现错误!/n");
printf("请按任意键返回主菜单.../n");
getch();
return ERROR;
}
head=NULL;
printf("请输入学生的信息:学号:/n");
scanf("%s",p->num);
printf("请输入学生的信息:名字:/n");
scanf("%s",p->name);
printf("请输入学生的信息:电话:/n");
scanf("%s",p->phone);
head=p;
q=p;
flag1=1;
i++;
while(flag1)
{
printf("还要继续输入码?y/n/n");
scanf("%s",&ch); /*不能用%c不知道为什么*/
if(ch=='y')
{
if(!(p=(struct address*)malloc(sizeof(struct address))))
{
printf("内存分配出现错误!/n");
printf("请按任意键返回主菜单.../n");
getch();
return ERROR;
}
q->next=p;
q=p;
printf("请输入学生的信息:学号:/n");
scanf("%s",p->num);
printf("请输入学生的信息:名字:/n");
scanf("%s",p->name);
printf("请输入学生的信息:电话:/n");
scanf("%s",p->phone);
i++;
}
else if(ch=='n')
{
flag1=0;
q->next=NULL; /*如果不加此句的话,打印时会出现错误*/
printf("请按任意键返回.../n");
return ERROR;
}
}/*while*/
q->next=NULL;
return head; /*换成return (head);也可以*/
}/*create*/
/*要解决输入一个时不出错的bug*/
/*显示函数*/
int print(struct address *head) /*因为要显示信息,所以就要传入参数,这里是传入链表的头指针*/
{
struct address *p; /*用于取链表的下一个结点*/
int j=0;
p=head;
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
printf("按任意键显示已输入的信息.../n");
getch();
while(p->next)
{
++j;
printf("这是第%d个学生信息",j);
printf("该学生的学号是:");
printf("%s/n",p->num);
printf("该学生的名字是:");
printf("%s/n",p->name);
printf("该学生的联系方式是:");
printf("%s/n",p->phone);
p=p->next;
if(j%20==0)
{
printf("按任意键进行翻页.../n");
getch();
system("cls");
printf("第%d个学生信息",j);
printf("该学生的学号是:");
printf("%s/n",p->num);
printf("该学生的名字是:");
printf("%s/n",p->name);
printf("该学生的联系方式是:");
printf("%s/n",p->phone); /*用于读取下一信息*/
}
}/*while*/
if(p)
{
++j;
printf("第%d个学生信息",j);
printf("该学生的学号是:");
printf("%s/n",p->num);
printf("该学生的名字是:");
printf("%s/n",p->name);
printf("该学生的联系方式是:");
printf("%s/n",p->phone);
}
printf("已显示完,按任意键返回主菜单...");
return OK;
}
/*查找函数*/
int search(struct address *head)
{
struct address *p,*q;
int flags=1;
q=(struct address*)malloc(sizeof(struct address));
p=head;
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
printf("请输入你想要查询的学生的学号:");
scanf("%s",q->num);
if(p->next)
{
while(p->next)
{
if(strcmp(q->num,p->num)==0)
{
printf("该学生的信息如下:/n");
printf("该学生的学号是:");
printf("%s/n",p->num);
printf("该学生的名字是:");
printf("%s/n",p->name);
printf("该学生的联系方式是:");
printf("%s/n",p->phone);
flags=0;
printf("按任意键返回主菜单..."); /*跳出循环,防止无限循环*/
getch();
return OK;
}
else
{
p=p->next;
}
}/*while*/
}/*if*/
if(strcmp(q->num,p->num)==0)
{
printf("该学生的信息如下/n:");
printf("该学生的学号是:");
printf("%s/n",p->num);
printf("该学生的名字是:");
printf("%s/n",p->name);
printf("该学生的联系方式是:");
printf("%s/n",p->phone);
printf("按任意键返回主菜单...");
getch();
return OK;
}
else
{
printf("找不到学号为%s的学生信息...",q->num);
printf("按任意键返回主菜单...");
getch();
return ERROR;
}
}
/*插入函数*/
struct address *insert(struct address *head) /*可能会修改了链表的头指针,所以要返回头指针*/
{
struct address *p,*q;
char ch;
q=p=(struct address *)malloc(sizeof(struct address));
p=head;
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
printf("请输入你要插入的学生信息:/n");
printf("请输入学生的学号:");
scanf("%s",q->num);
printf("/n请输入学生的名字:");
scanf("%s",q->name);
printf("/n请输入学生联系方式:");
scanf("%s",q->phone);
printf("/n是否要保存该数据y/n?");
scanf("%s",&ch);
if(ch=='y')
{
printf("若要保存则保存并显示");
for(;p->next;p=p->next); /*插入到最后一个结点*/
p->next=q;
q->next=NULL;
i++;
return head;
}
else
if(ch=='n')
{
printf("你输入的信息是:(你已选择不保存)");
printf("该学生学号%s:/n",q->num);
printf("该学生姓名%s:/n",q->name);
printf("该学生联系方式%s:/n",q->phone);
}
return head;
}
/*删除函数*/
struct address *dele(struct address *head)
{
struct address *p,*q,*w;
q=p=(struct address *)malloc(sizeof(struct address));
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
printf("请输入要删除学生信息的学号:");
scanf("%s",q->num);
p=head;
if(strcmp(p->num,q->num)==0) /*只有一个学生信息并且匹配或者第一匹配*/
{
head=p->next;
free(p);
i--;
printf("已经成功删除,按任意键返回主菜单S...");
return head;
}/*if*/
while(p->next) /*至少两个学生信息*/
{
w=p;
p=p->next;
if(strcmp(p->num,q->num)==0)
{
w->next=p->next;
free(p);
i--;
printf("已经成功删除,按任意键返回主菜单S...");
return head;
}
} /*while*/
if(strcmp(p->num,q->num)==0)
{
w->next=p->next;
free(p);
i--;
printf("已经成功删除,按任意键返回主菜单S...");
return head;
}
printf("找不到学号为%s的学生信息",q->num);
printf("按任意键返回...");
getch();
return head;
}
/*排序函数*/
struct address *sort(struct address *head)
{
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
return head;
}
int save(struct address *head)
{
char finame[30];
struct address *p;
p=head;
system("cls");
if(!head)
{
printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");
return ERROR;
}
printf("请输入要保存的文件名:");
scanf("%s",finame);
if((pf=fopen(finame,"w+"))==NULL)
{
printf("保存文件失败!按任意键返回主菜单...");
return ERROR;
}
else
{
while(p)
{
fwrite(p,sizeof(struct address),1,pf);
p=p->next;
}
printf("保存文件成功!按任意键返回主菜单...");
}
fclose(pf);
return OK;
}
struct address * load(void)
{
struct address *p,*q;
char finame2[30];
system("cls");
printf("请输入你要打开的文件名:");
scanf("%s",finame2);
if((fp=fopen(finame2,"rb"))==NULL) /*fp=fopen(finame2,"rb")外面要再加一层括号,不然会有wanning*/
{
printf("你要打开的文件为空或者不存在,按任意键返回...");
return ERROR;
}
i=0; /*i重新置为0*/
head=(struct address *)malloc(sizeof(struct address));
fread(head,sizeof(struct address),1,fp);/*把第一个元素赋给head*/
i++;
p=q=head;
while((p->next)!=NULL)
{
p=(struct address *)malloc(sizeof(struct address));
fread(p,sizeof(struct address),1,fp);
q->next=p;
q=p;
i++;
}
q->next=NULL; /*最后一定要的后继一定要置为NULL*/
fclose(fp); /*关闭文件*/
printf("读入文件成功,按任意键返回主菜单,可以在打印链表中查看信息...");
return head;
}
void main()
{
/*struct address *p,*q;*/
char ch;
int x0,y0;
while(1)
{
x0=22;
y0=5;
system("cls");
gotoxy(x0,y0); printf("+***********************************+/n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 1:建立链表 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 2:打印链表 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 3:查找信息 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 4:删除信息 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 5:插入信息 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 6:保存信息 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 7:打开文件 */n");
gotoxy(x0,y0+=1);printf("| |/n");
gotoxy(x0,y0+=1);printf("* 0:退出系统 */n");
gotoxy(x0,y0+=1);printf("+***********************************+/n");
gotoxy(x0,y0+=1);printf("请从0至8中选择你要进行的操作:");
scanf("%s",&ch);
switch(ch)
{
case'1':create();break;
case'2':print(head);break;
case'3':search(head);break;
case'4':dele(head);break;
case'5':insert(head);break; /*还差保存显示功能*/
case'6':save(head);break;
case'7':load();break;
case'0':exit(0);break;
}
getch();
}/*while*/
}