您的位置:首页 > 其它

工在课程设计--通讯录

2015-01-08 00:00 155 查看

题目

2、通讯录管理系统

编程实现通讯录管理系统,要求该系统能够完成通讯信息的建立、查询、插入、删除等基本功能。程序运行后至少给出下面7个菜单项的选择并分别实现其功能:
0、 通讯录的建立 1、通讯录信息输出
2、 通讯者结点信息的删除 3、通讯者结点信息的查询
4、 通讯者结点信息的插入 5、通讯录信息更改
6、 退出通讯录管理系统
设计的任务要求,通讯录中每个学生的基本信息应包括姓名、地址、电话等基本信息,采用链表存储结构。(复习c语言结构体和链表知识)

文件布局

PS D:\code\gongda\she\she_z_2> tree /f
卷 软件 的文件夹 PATH 列表
卷序列号为 0007-DC50
D:.
│  .cproject
│  .project
│  Makefile
│
├─include
│      person.h
│      personList.h
│
└─src
Main.c
person.c
personList.c

PS D:\code\gongda\she\she_z_2>


person.h

//人定义

/** @file person.h
* 功能:通讯录 人定义
* 作者:小代码
* 时间:2015年1月8日18:45:00
*
*/

#ifndef INCLUDE_PERSON_H_
#define INCLUDE_PERSON_H_

/** @struct 人结构体定义
*
*/
struct _person{
/** @brief 姓名  */
char name[10];

/** @brief 地址 */
char address[50];

/** @brief 电话  */
char phone[15];

/** @brief 向后指针域  */
struct _person * next;

/** @brief 向前指针域  */
struct _person * pre;
};

typedef struct _person person;
typedef struct _person * personPtr;

/** @brief 创建一个人
*
* @param name 名字
* @param address 地址
* @param phone 电话
* @return 所创建的人对象的指针
*/
personPtr person_create( char name[10], char address[50], char phone[15]);

/** @brief 输出一个人的信息
*
* @param p 要输出信息的人
*
* @pre p p 不为空
*
* @retval 0 输出成功
* @retval 1 输出失败
*/
int person_print( personPtr p );

/** @brief 修改信息
*
* 将p的属性与相应参数不同的修改
*
* @param p 要修改信息的人
* @param name 名字
* @param address 地址
* @param phone 电话
*
* @pre p 存在
*
* @retval 0 修改成功
* @retval -1 修改失败
*/
int person_modiry(personPtr p, char name[10], char address[50], char phone[15]);

#endif /* INCLUDE_PERSON_H_ */


person.c

//人操作实现

/*
* person.c
*
*  Created on: 2015年1月8日
*      Author: laolang
*/

#include"../include/person.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/** @brief 创建一个人
*
* @param name 名字
* @param address 地址
* @param phone 电话
* @return 所创建的人对象的指针
*/
personPtr person_create( char name[10], char address[50], char phone[15]){
personPtr p = (personPtr)malloc(sizeof(person));
if( NULL == p ){
puts("动态分配内存失败...person_create...p");
exit(-1);
}

strcpy(p->name,name);
strcpy(p->address,address);
strcpy(p->phone,phone);
p->next = NULL;
p->pre = NULL;

return p;
}

/** @brief 输出一个人的信息
*
* @param p 要输出信息的人
*
* @pre p p 不为空
*
* @retval 0 输出成功
* @retval 1 输出失败
*/
int person_print( personPtr p ){
if( NULL == p ){
puts("空指针...person_print...p");
return 1;
}

printf("%s\t%s\t%s\t\n",p->name,p->address,p->phone);

return 0;
}

/** @brief 修改信息
*
* 将p的属性与相应参数不同的修改
*
* @param p 要修改信息的人
* @param name 名字
* @param address 地址
* @param phone 电话
*
* @pre p 存在
*
* @retval 0 修改成功
* @retval -1 修改失败
*/
int person_modiry(personPtr p, char name[10], char address[50], char phone[15]){
int result = 0;

if( NULL == p ){
result = -1;
return result;
}

if( strcmp(p->name,name)){
strcpy(p->name,name);
puts("已更新名字!");
}

if( strcmp(p->address,address)){
strcpy(p->address,address);
puts("已更新地址!");
}

if( strcmp(p->phone,phone)){
strcpy(p->phone,phone);
puts("已更新电话!");
}

return result;
}


personList.h

//链表定义

/** @file personList.h
* 功能:通讯录链表定义
* 作者:小代码
* 时间:2015年1月8日19:06:35
*
*/

#ifndef INCLUDE_PERSONLIST_H_
#define INCLUDE_PERSONLIST_H_

#include"../include/person.h"
#include<string.h>

/** @struct 通讯录链表定义
*
*/
struct _personList {
/** @brief 头结点  */
personPtr head;

/** @brief 尾结点  */
personPtr last;

/** @brief 链表长度  */
int len;
};

typedef struct _personList plist;
typedef struct _personList * plistPtr;

/** @brief 创建链表
*
* @return 所创建的链表
*/
plistPtr plist_create();

/** @brief 向链表中添加元素
*
* @param list 要添加元素的链表
* @param p 要添加的元素
*
* @pre 链表 list 存在 p 不为空
*
* @retval 0 添加成功
* @retval -1 添加失败
*/
int plist_append(plistPtr list, personPtr p);

/** @brief 判断链表是否为空
*
* @param list 要判断的链表
*
* @pre 链表 list 存在
*
* @retval 1 为空
* @retval 0 不为空
* @retval -1 链表不存在
*/
int plist_is_empty(plistPtr list);

/** @brief 输出链表
*
* @param list 要输出的链表
*
* @pre 链表 list 存在 且不为空
*
* @retval 0 输出成功
* @retval -1 输出失败
*/
int plist_print(plistPtr list);

/** @brief 根据名字在链表中查找,若存在,则返回指向其的指针
*
* @param list 链表
* @param name 名字
*
* @pre 链表 list 存在 且不为空
*
* @return 所查找的元素的指针
* @retval NULL 查找失败
*/
personPtr plist_search_name(plistPtr list, char name[10]);

/** @brief 根据名字删除信息
*
* @param list 链表
* @param name 名字
*
* @pre 链表存在且不为空,name存在于链表中
*
* @retval 0 删除成功
* @retval -1 链表中无姓名为 name 的人
* @retval -2 链表为空或不存在
*/
int plist_delete_name( plistPtr list, char name[10]);

#endif /* INCLUDE_PERSONLIST_H_ */


personList.c

//链表操作实现

/*
* personList.c
*
*  Created on: 2015年1月8日
*      Author: laolang
*/

#include"../include/personList.h"
#include"../include/person.h"
#include<stdlib.h>
#include<stdio.h>

/** @brief 创建链表
*
* @return 所创建的链表
*/
plistPtr plist_create() {
plistPtr list = (plistPtr) malloc(sizeof(plist));
if ( NULL == list) {
puts("动态分配内存失败...plist_create...list");
exit(-1);
}

list->head = person_create("", "", "");
list->last = person_create("", "", "");
list->head->pre = NULL;
list->head->next = list->last;
list->last->pre = list->head;
list->last->next = NULL;
list->len = 0;

return list;
}

/** @brief 向链表中添加元素
*
* @param list 要添加元素的链表
* @param p 要添加的元素
*
* @pre 链表 list 存在 p 不为空
*
* @retval 0 添加成功
* @retval -1 添加失败
*/
int plist_append(plistPtr list, personPtr p) {
if ( NULL == list || NULL == p) {
return -1;
}

//	p->pre = list->last->pre;
//	p->next = list->last;
//	list->last->next = p;
//	list->last->pre = p;

list->last->pre->next = p;
p->pre = list->last->pre;
p->next = list->last;
list->last->pre = p;

list->len++;

return 0;
}

/** @brief 判断链表是否为空
*
* @param list 要判断的链表
*
* @pre 链表 list 存在
*
* @retval 1 为空
* @retval 0 不为空
* @retval -1 链表不存在
*/
int plist_is_empty(plistPtr list) {
int result = 0;
if ( NULL == list) {
result = -1;
return result;
}

if ( list->last == list->head->next) {
result = 1;
return result;
}

return result;
}

/** @brief 输出链表
*
* @param list 要输出的链表
*
* @pre 链表 list 存在 且不为空
*
* @retval 0 输出成功
* @retval -1 输出失败
*/
int plist_print(plistPtr list) {
//	puts("开始输出");
int result = -1;
if (plist_is_empty(list)) {
return result;
}
personPtr t = list->head->next;
while (t != list->last) {
person_print(t);
t = t->next;
}

result = 0;
return result;
}

/** @brief 根据名字在链表中查找,若存在,则返回指向其的指针
*
* @param list 链表
* @param name 名字
*
* @pre 链表 list 存在 且不为空
*
* @return 所查找的元素的指针
* @retval NULL 查找失败
*/
personPtr plist_search_name(plistPtr list, char name[10]) {
personPtr t = NULL;
if (plist_is_empty(list)) {
return t;
}

personPtr p = list->head->next;
while (p != list->last) {
if (!strcmp(p->name, name)) {
t = p;
break;
}
p = p->next;
}

return t;
}

/** @brief 根据名字删除信息
*
* @param list 链表
* @param name 名字
*
* @pre 链表存在且不为空,name存在于链表中
*
* @retval 0 删除成功
* @retval -1 链表中无姓名为 name 的人
* @retval -2 链表为空或不存在
*/
int plist_delete_name(plistPtr list, char name[10]) {
int result = 0;
personPtr p = NULL;

if ( NULL == list || plist_is_empty(list)) {
result = -2;
return result;
}

if (!(p = plist_search_name(list, name))) {
result = -1;
return result;
}

p->pre->next = p->next;
p->next->pre = p->pre;

free(p);

return result;
}


Main.c

//主文件

/*
* Main.c
*
*  Created on: 2015年1月8日
*      Author: laolang
*/

#include"../include/person.h"
#include"../include/personList.h"
#include<stdio.h>
#include<stdlib.h>

int menu() {
int select = 0;
puts("\n0-建立通讯录\t\t\t1-通讯录信息输出");
puts("2-通讯者结点信息删除\t\t3-通讯者结点信息查询");
puts("4-通讯者结点信息插入\t\t5-通讯者信息更改");
puts("6-退出通讯录管理系统");
printf("输入选择:");
scanf("%d", &select);
while (select < 0 || select > 6) {
puts("请输入0-6的整数");
printf("输入选择:");
scanf("%d", &select);
}

return select;
}

int main(void) {
int select = menu();
plistPtr list = NULL;

while (1) {
switch (select) {
case 0: {
if ((list = plist_create())) {
puts("通讯录建立成功!");
}
break;
}
case 1: {
if (1 == plist_is_empty(list)) {
puts("通讯录中没有任何信息!");
} else {
plist_print(list);
}
break;
}
case 2: {
char name[10];
printf("输入要删除的人的名字:");
scanf("%s", name);
int result = plist_delete_name(list, name);
if (!result) {
puts("删除成功!");
} else if (-1 == result) {
puts("通讯录中无此人信息");
}
break;
}
case 3: {
char name[10];
printf("输入要查询的人的名字:");
scanf("%s", name);
personPtr p = plist_search_name(list, name);
if (p) {
person_print(p);
} else {
puts("查无此人!");
}
break;
}
case 4: {
char name[10];
char address[50];
char phone[15];
printf("输入名字:");
scanf("%s", name);
printf("输入地址:");
scanf("%s", address);
printf("输入电话:");
scanf("%s", phone);
personPtr p = person_create(name, address, phone);
if (!plist_append(list, p)) {
puts("添加成功!");
} else {
puts("添加失败!");
}
break;
}
case 5: {
char name[10];
char address[50];
char phone[15];
char ch = 0;
//			int ch = 0;
printf("输入要更改信息的人的名字:");
scanf("%s", name);
personPtr p = plist_search_name(list, name);
if ( NULL == p) {
puts("查无此人!");
} else {
printf("是否修改名字[y/n]:");
getchar();
scanf("%c", &ch);
//				printf("ch = %c\n", ch);

if ('y' == ch || 'Y' == ch) {
printf("输入新的名字:");
scanf("%s", name);
}

printf("是否修改地址[y/n]:");
getchar();
ch = getchar();

//				printf("ch = %c\n", ch);
if ('y' == ch || 'Y' == ch) {
printf("输入新的地址:");
scanf("%s", address);
}

printf("是否修改电话[y/n]:");
getchar();
ch = getchar();
//				printf("ch = %c\n", ch);
if ('y' == ch || 'Y' == ch) {
printf("输入新的电话:");
scanf("%s", phone);
}

if (!person_modiry(p, name, address, phone)) {
puts("修改成功!");
} else {
puts("修改失败!");
}
}
break;
}
case 6: {
puts("谢谢使用!!!");
puts("正在退出...");
puts("已退出");
exit(-1);
break;
}
}

select = menu();
}
printf("\n\nHello World\n");
return 0;
}


Makefile

# 功能:工大通讯录
#
# 作者:小代码
#
# 时间:2015年1月8日18:56:54
#
#
#
#
program=test.exe

CC=gcc
CFLAGS=-Wall -I include

RM=del

vpath %.h include
vpath %.c src

DIR:=$(wildcard *.c ./src/*.c)
SOURS:=$(notdir $(DIR))
OBJS:=$(patsubst %.c,%.o,$(SOURS))

all:$(program)

$(program):$(OBJS)
$(CC) -o $@ $^

Main.o:person.h personList.h

person.o:person.h

personList.o:personList.h

.PHNOY:clean run list

clean:
-$(RM) $(program) $(OBJS)

run:
./$(program)

list:
@echo $(DIR)
@echo $(SOURS)
@echo $(OBJS)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: