工在课程设计--通讯录

题目


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)






你可能感兴趣的:(工在课程设计--通讯录)