C语言基于单链表的班级通讯录(VS2019)

Class Community Book程序快捷目录

  • 注意
  • 文字描述
    • 问题描述
    • 基本要求
  • 代码部分
    • 头文件
    • 主程序
    • 功能程序

注意

本程序由VS2019编写,属于记录学习过程,仍有许多问题尚未解决。

文字描述

问题描述

将文件中的通讯信息存入一个单链表。元素中的通讯信息包括每一位同学的:学号、姓名、性别、宿舍、联系电话等。要求能够利用姓名和序号进行有关查找、插入、删除等操作。

基本要求

(1)将本班的通讯信息输入文本文件“XXX_info.txt”中,读取该文件,将其中的通讯录信息存入一个单链表中;

(2)给定一个姓名,返回其信息;

(3)给定一个序号,返回其信息;

(4)在最后一条记录后增加一条信息;

(5)将一条新的记录插入在第i条记录之前;

(6)将一条新的记录插入在姓名为“XXX”的学生记录之前;

(7)删除第i条记录;

(8)删除姓名为“XXX”的学生记录;

(9)退出程序时,将单链表中内容再写入文本文件“XXX.txt”中,然后销毁该线性表。

代码部分

头文件

#include
#include
#include
#include
#define filepath "D:/Microsoft Visual Studio/Code/CCB.txt"//定义文件绝对地址(相对地址也可以)

typedef struct {
	char id[8];
	char name[20];
	char sex[5];
	char dorm[5];
	char phn[12];
}TelBook;
typedef struct LNode{
	TelBook data;
	struct LNode* next;
}LNode, *LinkList;

void main();//主程序
void Face1();//显示菜单
Status Traverse1(LinkList L);//展示链表
Status InputFile(LinkList L);//读取文件
Status OutputFile(LinkList L);//输出文件
Status LinkListInit(LinkList* L);//创建链表
Status DestroyList(LinkList* L);//销毁链表
Status KeySearch(LinkList L);//序号搜索
Status NameSearch(LinkList L);//姓名搜索
Status ListEmpty(LinkList L);//判断链表是否为空
Status AddInfo(LinkList* L);//顺序添加
Status NameInsert(LinkList* L);//姓名前插入
Status KeyInsert(LinkList* L);//序号前插入
Status KeyDelete(LinkList* L);//序号删除
Status NameDelete(LinkList* L);//姓名删除

主程序

#include"CCB.h"

//主程序
void main() {
	LinkList L;
	LinkListInit(&L);
	while (1) {
		system("cls");
		Face1();
		printf("请选择要使用的功能编号:");
		switch (Input()) {
			case 1: 
				system("cls");
				if (InputFile(L) == -1) {
					printf("读取失败!\n");
					system("pause");
					break;
				}
				printf("读取成功!\n");
				system("pause");
				break;
			case 2:
				system("cls");
				Traverse1(L);
				system("pause");
				break;
			case 3:
				system("cls");
				NameSearch(L);
				system("pause");
				break;
			case 4:
				system("cls");
				KeySearch(L);
				system("pause");
				break;
			case 5:
				system("cls");
				AddInfo(&L);
				system("pause");
				break;
			case 6:
				system("cls");
				KeyInsert(&L);
				system("pause");
				break;
			case 7:
				system("cls");
				NameInsert(&L);
				system("pause");
				break;
			case 8:
				system("cls");
				KeyDelete(&L);
				system("pause");
				break;
			case 9:
				system("cls");
				NameDelete(&L);
				system("pause");
				break;
			case 0:
				OutputFile(L);
				DestroyList(&L);
				exit(0);
				break;
			default:
				system("cls");
				printf("!!!!!请输入正确的功能编号!!!!!\n");
				system("pause");
		}
	}
}


//显示菜单
void Face1(){
	printf("************************************************************\n");
	printf("*                 Class Communication Book                 *\n");
	printf("************************************************************\n");
	printf("*                         功能列表                         *\n");
	printf("************************************************************\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("*     9.删除指定姓名信息                                   *\n");
	printf("*     0.退出本程序(!退出时自动保存并删除链表!)            *\n");
	printf("************************************************************\n");
}

功能程序


//读取文件
Status InputFile(LinkList L) 
{
	LinkList p, q;
	FILE* fp;
	char str[35];//存放第一排内容
	p = L;
	q = (LNode*)malloc(sizeof(LNode));

	if (fopen_s(&fp, filepath, "r") != OK) return -1;//判断读取成功
	fgets(str, sizeof(str) - 1, fp);//读取第一排内容
	while (!feof(fp)) {
		fscanf_s(fp, "%s%s%s%s%s", &q->data.id, 8, &q->data.name, 20, &q->data.sex, 5, &q->data.dorm, 5, &q->data.phn, 12);
		p->next = q;
		p = p->next;
		p->next = NULL;
		q = (LNode*)malloc(sizeof(LNode));
	}
	fclose(fp);
	return OK;
}


//输出文件
Status OutputFile(LinkList L)
{
	FILE* fp;
	LinkList p = L;
	printf("0");
	if (ListEmpty(p) != OK)
		return -1;
	if (fopen_s(&fp, filepath, "w") != OK) {
		printf("读取文件失败");
		return -2;
	}
	fprintf(fp, "序号 学号 姓名 性别 宿舍 电话号码\n");
	p = p->next;
	while (p->next != NULL) {
		fprintf_s(fp, "%s %s %s %s %s\n", p->data.id, p->data.name, p->data.sex, p->data.dorm, p->data.phn);
		p = p->next;
	}
	fprintf_s(fp, "%s %s %s %s %s", p->data.id, p->data.name, p->data.sex, p->data.dorm, p->data.phn);
	fclose(fp);
	return 0;
}


//创建链表
Status LinkListInit(LinkList* L)
{
	(*L) = (LNode*)malloc(sizeof(LNode));
	if ((*L) == NULL) {
		printf("空间分配失败");//判断内存收分配成功
		return -1;
	}
	(*L)->next = NULL;
	return OK;
}


//销毁链表
Status DestroyList(LinkList* L){
	LinkList p = NULL;
	if (ListEmpty(*L) != OK)
		return -1;
	while (*L) {
		p = (*L);
		*L = (*L)->next;
		free(p);
	}
	return OK;
}


//展示链表
Status Traverse1(LinkList L) {
	LinkList p = L->next;
	if (ListEmpty(p) != OK)
		return -1;
	printf("学号 姓名 性别 宿舍 电话号码\n");
	while (p != NULL) {
		printf("%s %s %s %s %s\n", p->data.id, p->data.name, p->data.sex, p->data.dorm, p->data.phn);
		p = p->next;
	}
	return OK;
}


//序号搜索
Status KeySearch(LinkList L) {
	int i = 0;
	int n = 0;
	printf("请输入要搜索的序号:");
	scanf_s("%d", &n);
	LinkList p = L;
	if (ListEmpty(p) != OK)
		return -1;
	while (i != n && p != NULL) {
		p = p->next;
		i++;
	}
	if (p == NULL){
		printf("输入的序号已超出\n");
		return -1;
	}
	printf("学号 姓名 性别 宿舍 电话号码\n");
	printf("%s %s %s %s %s\n", p->data.id, p->data.name, p->data.sex, p->data.dorm, p->data.phn);
	return OK;
}

//姓名搜索
Status NameSearch(LinkList L) {
	printf("请输入想搜索的姓名:");
	LinkList q, p = (LNode*)malloc(sizeof(LNode));
	q = L->next;
	if (ListEmpty(q) != OK)
		return -1;
	scanf_s("%s", &p->data.name, 20);
	while (q != NULL && strcmp(q->data.name, p->data.name) != 0) {
		q = q->next;
	}
	if (q == NULL) {
		printf("通讯录中没有该姓名!\n");
		return -2;
	} 
	printf("学号 姓名 性别 宿舍 电话号码\n");
	printf("%s %s %s %s %s\n", q->data.id, q->data.name, q->data.sex, q->data.dorm, q->data.phn);
	return OK;
}


//判断链表是否为空
Status ListEmpty(LinkList L) {
	if (L == NULL) return -1;//0为空表
	else if (L->next != NULL) return OK;//1为非空表
	return OK;
}


//顺序添加
Status AddInfo(LinkList* L) {
	printf("请输入要加入的信息(包括:学号 姓名 性别 寝室 电话号码):\n");
	LinkList p, q;
	q = (*L)->next;
	if (ListEmpty(q) != OK)
		return -1;
	while (q->next != NULL) {
		q = q->next;
	}
	p = (LNode*)malloc(sizeof(LNode));
	scanf_s("%s%s%s%s%s", &p->data.id, 8, &p->data.name, 20, &p->data.sex, 5, &p->data.dorm, 5, &p->data.phn, 12);
	p->next = NULL;
	q->next = p;
	return OK;
}


//序号前插入
Status KeyInsert(LinkList* L) {
	printf("需要在几号元素前插入?\n");
	int i = 0;
	int n = 0;
	scanf_s("%d", &n);
	LinkList p = (*L), q;
	if (ListEmpty(p) != OK)
		return -1;
	while (i != (n - 1) && p != NULL) {
		p = p->next;
		i++;
	}
	if (p == NULL) {
		printf("无法在超出的序号前插入数据!\n");
		return -1;
	}
	printf("请输入要加入的信息(包括:学号 姓名 性别 寝室 电话号码):\n");
	q = (LNode*)malloc(sizeof(LNode));
	scanf_s("%s%s%s%s%s", &q->data.id, 8, &q->data.name, 20, &q->data.sex, 5, &q->data.dorm, 5, &q->data.phn, 12);
	q->next = p->next;
	p->next = q;
	q = NULL;
	return OK;
}


//姓名前插入
Status NameInsert(LinkList* L) {
	printf("需要在哪一位同学前插入信息?\n");
	printf("姓名:");
	char n[20];
	scanf_s("%s", n, 20);

	LinkList q = (*L), p, t;
	p = q->next;
	while (strcmp(p->data.name, n) != 0 && q != NULL)
	{
		q = q->next;
		if (q->next == NULL) {
			printf("输入的同学名称不在表中!!\n");
			return -2;
		}
		p = q->next;
	}
	if (p == NULL) {
		printf("输入的同学名称不在表中!!\n");
		return -1;
	}
	printf("请输入要加入的信息(包括:学号 姓名 性别 寝室 电话号码):\n");
	t = (LNode*)malloc(sizeof(LNode));
	scanf_s("%s%s%s%s%s", &t->data.id, 8, &t->data.name, 20, &t->data.sex, 5, &t->data.dorm, 5, &t->data.phn, 12);
	t->next = q->next;
	q->next = t;
	t = NULL;
	return OK;
}


//序号删除
Status KeyDelete(LinkList* L) {
	if (ListEmpty(*L) != OK)
		return -1;
	printf("请输入需要删除的序号:");
	int i = 0;
	int n = 0;
	scanf_s("%d", &n);
	LinkList p = (*L), q;
	while (p != NULL && i != (n - 1))
	{
		p = p->next;
		i++;
	}
	if (p == NULL) {
		printf("输入的序号超出范围!!!\n");
		return -2;
	}
	q = p->next;
	p->next = q->next;
	q = NULL;
	return OK;
}


//姓名删除
Status NameDelete(LinkList* L) {
	printf("需要删除的姓名:");
	char n[20];
	scanf_s("%s", n, 20);
	LinkList q = (*L), p;	
	p = q->next;
	while (q != NULL && (strcmp(n, p->data.name) != 0))
	{
		q = q->next;		
		if (q->next == NULL) {
			printf("输入的同学名称不在表中!!\n");
			return -2;
		}
		p = q->next;
	}
	if (p == NULL) {
		printf("该同学不在通讯录中!!!\n");
		return -2;
	}
	q->next = p->next;
	p = NULL;
	return OK;
}

你可能感兴趣的:(数据结构学习记录,c语言,数据结构,单链表)