参考文献
[1]++程序设计教程 ,王连相,中国铁道出版社,2007 [2] C语言程序设计,谭浩强,清华大学出版社,1999
[3]C程序设计题解与上机指导,谭浩强,清华大学出版社,1999 [4] C语言的实际应用,安徽科学技术出版社,2000 [5] C语言函数手册,机械工业出版社,1999
[6] C语言实用程序荟萃,西安电子科技大学出版社,1993
c
致 谢
在编写程序的过程中,我们得到了丁政建老师的精心指导以及孜孜不倦的教诲,在老师的指导下,我们的能力得到了提高,同时养成了科学、严谨的作风和习惯,在此,我们对老师的精心栽培表示衷心的感谢!
感谢我们小组同学对我的帮助和指点,尤其感谢我的舍友在非常时期,在生活和学习上帮我许多忙。
在课设即将完成之际,我的心情无法平静,从开始进入课题到课设的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意。
附件Ⅰ 部分原程序代码
#include \标准输入输出函数库*/ #include \标准函数库*/ #include \字符串函数库*/
#define HEADER1 \--------------------------------所有记录--------------------------------- \\n\
#define HEADER2 \编号 | 姓名 | 电话号码 |年龄| 地址 | 邮箱 |\\n\
#define HEADER3 \|------|---------------|---------------|--- |----------|--------------------|\\n \
#define FORMAT \#define DATA p->data.num,p->data.name ,p->data. phone,p->data.age,p->data.address,p->data.email
#define END \
int save=0; /*是否需要存盘的标志变量*/ /*定义与联系人有关的数据结构*/
struct person /*标记为person*/ {
char num[6]; /*联系人编号*/ char name[15] ; /*联系人姓名*/ char phone[12]; /*联系人电话号码*/ int age; /*联系人年龄*/ char address[10]; /*联系人地址*/ char email[20]; /*联系人电子邮箱*/ };
/*定义每条记录或结点的数据结构,标记为:node*/ typedef struct node {
struct person data; /*数据域*/ struct node *next; /*指针域*/
}Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/
void menu() /*主菜单*/ {
printf(\(200704135086)的通讯录\\n\ printf(\
*************************Menu********************************\\n\
printf(\添加记录 2 删除记录 *\\n\ printf(\修改记录 4 查询记录 *\\n\ printf(\显示记录 6 保存记录 *\\n\
printf(\退出系统 *\\n\ printf(\
*************************************************************\\n\
}
void printhead() /*格式化输出表头*/ {
printf(HEADER1); printf(HEADER2); printf(HEADER3); }
void printdata(Node *pp) /*格式化输出表中数据*/ {
Node* p; p=pp;
printf(FORMAT,DATA); }
/*显示单链表l中存储的联系人记录,内容为person结构中定义的内容*/ void Disp(Link l) {
Node *p; p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储联系人信息,指针域指向的后继结点才有联系人信息*/
if(!p) /*p==NULL,NUll在stdlib中定义为0*/ {
printf(\没有记录!\\n\ return; }
printf(\
printhead(); /*输出表格头部*/
while(p) /*逐条输出链表中存储的联系人信息*/ {
printdata(p);
p=p->next; /*移动直下一个结点*/ printf(HEADER3); } }
/************************************************************* 作用:用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:findmess[]保存要查找的具体内容; nameornum[]保存按什么查找; 在单链表l中查找;
**************************************************************/ Node* Locate(Link l,char findness[],char nameornum[]) {
*/
Node *r;
if(strcmp(nameornum,\按编号查询*/ {
r=l->next; while(r) {
if(strcmp(r->data.num,findness)==0) /*若找到findmess值的学号
return r; r=r->next; } }
else if(strcmp(nameornum,\按姓名查询*/ {
r=l->next; while(r) {
if(strcmp(r->data.name,findness)==0) /*若找到findmess值的联系人姓名*/
return r; r=r->next; } }
else if(strcmp(nameornum,\按地址查询*/ {
r=l->next; while(r) {
if(strcmp(r->data.address,findness)==0) /*若找到findmess值的联系人地址*/
return r; r=r->next; } }
return 0; /*若未找到,返回一个空指针*/ }
/*输入字符串*/
void stringinput(char *t,int lengths,char *attention) {
char n[255]; do{
printf(attention); /*显示提示信息*/ scanf(\输入字符串*/
if(strlen(n) > lengths)printf(\超过设定长度! \\n\进行长度校验,超过lengths值重新输入*/
}while(strlen(n) > lengths);
strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/ }
/*输入age中的数字*/
int numberinput(char *attention) {
int t=0;
printf(attention); scanf(\ return t; }
/*增加联系人记录*/ void Add(Link l) {
Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/ char flag=0,num[6]; r=l;
s=l->next;
Disp(l); /*先打印出已有的联系人信息*/ while(r->next!=NULL)
r=r->next; /*将指针移至于链表最末尾,准备添加记录*/
while(l) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/ {
while(l) /*输入学编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/
{
stringinput(num,6,\输入编号(按'0'返回主菜单):\格式化输入编号并检验*/
flag=0;
if(strcmp(num,\/*输入为0,则退出添加操作,返回主界面*/
{return;} s=l->next;
while(s) /*查询该编号是否已经存在,若存在则要求重新输入一个未被占用的学号*/
{
if(strcmp(s->data.num,num)==0) {