本程序由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;
}