基于单链表的班级通讯录
[问题描述]
将全班同学的通讯信息存入一个单链表。元素中的通讯信息包括每一位同学的:学号、姓名、性别、宿舍、联系电话等。要求能够利用姓名和序号进行有关查找、插入、删除等操作。
[基本要求]
(1)将本班的通讯信息输入文本文件“student_info.txt”中,读取该文件,将其中的通讯录信息存入一个单链表中;
(2)给定一个姓名,返回其通讯信息;
(3)给定一个序号,返回其通讯信息;
(4)在最后一条记录的后面增加一条学生信息;
(5)将一条新的记录插入在第i条记录之前;
(6)将一条新的记录插入在姓名为“XXX”的学生记录之前;
(7)删除第i条记录;
(8)删除姓名为“XXX”的学生记录;
(9)退出程序时,将单链表中内容再写入文本文件“student_info.txt”中,然后销毁该线性表。
链表结构:
//结点定义
typedef struct telebook //通讯录结点数据域
{ char num[MIX]; //学号char name[MIX]; //姓名char sex[MIX]; //性别char hostel[MIX]; //宿舍char telephone[MIX]; //电话号码
}telebook; typedef struct LNode //链表结点
{ telebook data; //结点数据域 struct LNode *next; //结点指针域
}LNode,*LinkList;
重要操作,将文件信息读入链表:
void readFile(LinkList &L) //读取文件信息
{LinkList q,p; FILE *fp; p=L; q=(LNode*)malloc(sizeof(LNode)); char name[20]="通讯录.txt";if((fp= fopen(name,"r"))==NULL){printf("error\n");exit(0);}while(p->next!=NULL ) { p=p->next; } while(fscanf(fp,"%s%s%s%s%s\n",q->data.num,q->data.name,q->data.sex,q->data.hostel,q->data.telephone)!=EOF) { q->next=NULL; p->next=q; p=q; q=(LNode*)malloc(sizeof(LNode));}printf(" 文件读取成功! \n");fclose(fp);
}
主函数:
void main()
{int n=1;LinkList L;InitList_L(L);while(n!=0){printf("*****************************基于单链表的班级通讯录*****************************\n");printf(" 1:读取文件(**请先读取文件**) | 2:通过姓名查找联系人\n\n");printf(" 3:通过学号查找联系人 | 4:在最后添加某学生信息\n\n");printf(" 5:将新联系人加在第i条记录之前 | 6:将新联系人加在“XXX”的学生之前\n\n");printf(" 7:删除第i条记录 | 8:删除姓名为“XXX”的学生记录\n\n");printf(" 9:显示结果 | 0:退出程序并保存 \n\n");printf("--------------------------------------------------------------------------------\n");printf("请选择操作<1-9>,退出<0>:");scanf("%d",&n);switch(n) {case 1:readFile(L);system("pause");//输入任意键继续 system("cls");//清屏break; case 2:Find_Name(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 3:Find_Num(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 4:CreateFromTail(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 5:ListInsert_L(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 6:ListInsert_LName(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 7:ListDelete_L(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 8:ListDelete_LName(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 9:PrintElem(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 0:saveFile(L);List_free(L); system("cls");//清屏break;}}
}
源程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MIX 100
typedef int Status ;
typedef char ElemType;
//结点定义
typedef struct telebook //通讯录结点数据域
{ char num[MIX]; //学号char name[MIX]; //姓名char sex[MIX]; //性别char hostel[MIX]; //宿舍char telephone[MIX]; //电话号码
}telebook; typedef struct LNode //链表结点
{ telebook data; //结点数据域 struct LNode *next; //结点指针域
}LNode,*LinkList; //读取文本信息
void readFile(LinkList &L); //单链表的初始化
Status InitList_L(LinkList &L);void Find_Name(LinkList &L); //按姓名查询void Find_Num(LinkList &L); //按姓名查询Status CreateFromTail(LinkList &L); //采用尾插法在尾部插入元素//初始条件:线性表L已经存在
//在单链线性表L的第i个元素之前插入元素
Status ListInsert_L(LinkList &L);//在单链线性表L的姓名元素之前插入元素
Status ListInsert_LName(LinkList &L);
Status Fund_LName(LinkList &L); //寻找该姓名的位置//初始条件:线性表L已经存在
//删除第i个元素
Status ListDelete_L(LinkList &L);Status ListDelete_LName(LinkList &L); //删除姓名为“XXX”的学生记录void saveFile(LinkList &L); //保存通讯录到文件//初始条件:线性表L已经存在
//打印出所有元素
void PrintElem(LinkList L);void List_free(LinkList L); //销毁链表//单链表的初始化
Status InitList_L(LinkList &L)
{L =(LNode *)malloc(sizeof(LNode)); //申请结点空间 if(L == NULL) //判断是否有足够的内存空间 printf("申请内存空间失败\n");L->next = NULL; //将next设置为NULL,初始长度为0的单链表 return OK;
} void readFile(LinkList &L) //读取文件信息
{LinkList q,p; FILE *fp; p=L; q=(LNode*)malloc(sizeof(LNode)); char name[20]="通讯录.txt";if((fp= fopen(name,"r"))==NULL){printf("error\n");exit(0);}while(p->next!=NULL ) { p=p->next; } while(fscanf(fp,"%s%s%s%s%s\n",q->data.num,q->data.name,q->data.sex,q->data.hostel,q->data.telephone)!=EOF) { q->next=NULL; p->next=q; p=q; q=(LNode*)malloc(sizeof(LNode));}printf(" 文件读取成功! \n");fclose(fp);
}void Find_Name(LinkList &L) //按姓名查询
{ LinkList q,p; q=L->next; printf("输入要查询的姓名:\n"); p=(LNode*)malloc(sizeof(LNode)); scanf("%s",p->data.name); while(q!=NULL&&strcmp(q->data.name,p->data.name)!=0) { q=q->next; } if(q==NULL) { printf("通讯录中没有这个姓名!\n"); } else { printf("已经找到此联系人!\n"); printf(" 学号 姓名 性别 宿舍 电话号码 \n"); printf("%s %s\t %s\t %s %s\n",q->data.num,q->data.name,q->data.sex,q->data.hostel,q->data.telephone); }
} void Find_Num(LinkList &L) //按学号查询
{ LinkList q,p; q=L->next; printf("输入要查询的编号:\n"); p=(LNode*)malloc(sizeof(LNode)); scanf("%s",p->data.num); while(q!=NULL&&strcmp(q->data.num,p->data.num)!=0) { q=q->next; } if(q==NULL) { printf("通讯录中没有这个编号!\n"); } else { printf("已经找到此联系人!\n"); printf(" 学号 姓名 性别 宿舍 电话号码 \n"); printf("%s %s\t %s\t %s %s\n",q->data.num,q->data.name,q->data.sex,q->data.hostel,q->data.telephone); }
} Status CreateFromTail(LinkList &L) //采用尾插法在尾部插入元素
{LinkList r, s;r=L; //r指针始终动态指向链表的当前表尾while(r->next){//尾插法,直接把指针移位到尾部 r=r->next; }s=(LinkList)malloc(sizeof(LNode)); printf("在尾部插入的联系人信息为:\n");printf(" 学号 姓名 性别 宿舍 电话号码 \n");scanf("%s%s%s%s%s",s->data.num,s->data.name,s->data.sex,s->data.hostel,s->data.telephone);s->next=NULL;r->next=s; return OK;
}//初始条件:线性表L已经存在
//在单链线性表L的第i个元素之前插入元素
Status ListInsert_L(LinkList &L){LinkList s,p=L;int j = 0,i;printf("输入要插入的位置:"); scanf("%d",&i);while (p&&j < i) { // 寻找第i个结点p = p->next;++j;} if (!p || j > i) {printf("----无此位置添加失败-----\n");return ERROR;} // i小于1或者大于表长s = (LinkList)malloc(sizeof(LNode)); // 生成新结点printf("插入的联系人信息为:\n");printf(" 学号 姓名 性别 宿舍 电话号码 \n");scanf("%s%s%s%s%s",s->data.num,s->data.name,s->data.sex,s->data.hostel,s->data.telephone); s->next = p->next; // 插入L中p->next = s;return OK;
} // LinstInsert_LStatus Fund_LName(LinkList &L) //寻找该姓名的位置{LinkList s,p=L->next;int i=0;s=(LNode*)malloc(sizeof(LNode));scanf("%s",s->data.name);while(p!=NULL&&strcmp(p->data.name,s->data.name)!=0){p=p->next;++i;}return i+1;
}//在单链线性表L的姓名元素之前插入元素
Status ListInsert_LName(LinkList &L)
{ LinkList s,q=L,p=L->next;printf("输入要在谁的姓名之前添加信息:");int i=Fund_LName(L);int j=0;while (q&&j < i-1) { // 寻找第i-1个结点q = q->next;++j;} if (p==NULL) {printf("----查无此人添加失败-----\n");return ERROR;} // 如果没有找到s = (LinkList)malloc(sizeof(LNode)); // 生成新结点printf("插入的联系人信息为:\n");printf(" 学号 姓名 性别 宿舍 电话号码 \n");scanf("%s%s%s%s%s",s->data.num,s->data.name,s->data.sex,s->data.hostel,s->data.telephone); s->next = q->next; // 插入L中q->next = s;return OK;
}//初始条件:线性表L已经存在
//删除第i个元素
Status ListDelete_L(LinkList &L)
{LinkList p=L,q;int j = 0,i;printf("输入要删除的位置:"); scanf("%d",&i);while (p->next && j < i) { // 寻找第i个结点,并令p指向其前趋p = p->next; ++j;}if (!(p->next) || j > i) {printf("----查无此人删除失败-----\n");return ERROR;} // 删除位置不合理q = p->next; p->next = q->next; // 删除并释放结点 free(q);printf("----删除成功-----\n");return OK;
} // ListDelete_LStatus ListDelete_LName(LinkList &L) //删除姓名为“XXX”的学生记录
{LinkList p=L,q;printf("输入要删除的学生的姓名:");int j = 0,i=Fund_LName(L); while (p->next && j < i-1) { // 寻找第i个结点,并令p指向其前趋p = p->next; ++j;}if (!(p->next) || j > i-1) {printf("----查无此人删除失败-----\n");return ERROR;} // 删除位置不合理q = p->next; p->next = q->next; // 删除并释放结点 free(q);printf("----删除成功-----\n");return OK;
}//初始条件:线性表L已经存在
//打印出所有元素
void PrintElem(LinkList L)
{LinkList p=L->next ;printf("当前的信息为:\n");while(p!=NULL){printf("%s %s\t %s\t %s %s\n",p->data.num,p->data.name,p->data.sex,p->data.hostel,p->data.telephone);p=p->next;}printf("\n");
}void saveFile(LinkList &L) //保存通讯录到文件
{ FILE*fp; LinkList p; p=L; if((fp=fopen("通讯录.txt","wt"))==NULL) exit(0); // "wt"方式打开文件时,如果源文件中有内容,追加 if(p==NULL||p->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { p=p->next; while(p!=NULL) { fprintf(fp,"%s %s\t %s\t %s %s",p->data.num,p->data.name,p->data.sex,p->data.hostel,p->data.telephone);fprintf(fp,"\n"); p=p->next; } fclose(fp); printf("通讯录已保存!\n"); }
}void List_free(LinkList L) //销毁链表
{ LinkList p; while(L!= NULL) { p=L; L=L->next; free(p); }
} /*readFile(L) InitList_L(L) Find_Name(L) Find_Num(L) CreateFromTail(L) ListInsert_L(L) ListInsert_LName(L)
ListDelete_L(L) ListDelete_LName(L) saveFile(L)PrintElem(L) List_free(L)*/void main()
{int n=1;LinkList L;InitList_L(L);while(n!=0){printf("*****************************基于单链表的班级通讯录*****************************\n");printf(" 1:读取文件(**请先读取文件**) | 2:通过姓名查找联系人\n\n");printf(" 3:通过学号查找联系人 | 4:在最后添加某学生信息\n\n");printf(" 5:将新联系人加在第i条记录之前 | 6:将新联系人加在“XXX”的学生之前\n\n");printf(" 7:删除第i条记录 | 8:删除姓名为“XXX”的学生记录\n\n");printf(" 9:显示结果 | 0:退出程序并保存 \n\n");printf("--------------------------------------------------------------------------------\n");printf("请选择操作<1-9>,退出<0>:");scanf("%d",&n);switch(n) {case 1:readFile(L);system("pause");//输入任意键继续 system("cls");//清屏break; case 2:Find_Name(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 3:Find_Num(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 4:CreateFromTail(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 5:ListInsert_L(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 6:ListInsert_LName(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 7:ListDelete_L(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 8:ListDelete_LName(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 9:PrintElem(L);system("pause");//输入任意键继续 system("cls");//清屏break;case 0:saveFile(L);List_free(L); system("cls");//清屏break;}}
}
结果展示:
基于单链表的班级通讯录相关推荐
- C语言基于单链表的班级通讯录(VS2019)
Class Community Book程序快捷目录 注意 文字描述 问题描述 基本要求 代码部分 头文件 主程序 功能程序 注意 本程序由VS2019编写,属于记录学习过程,仍有许多问题尚未解决. ...
- c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统
前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...
- C语言基于单链表的词典软件
C语言基于单链表的词典软件 实验1: 日期:2022-10-4 类型:设计型 题目:基于单链表的词典软件 内容: 利用单链表存储词典,可以实现从文件中加载数据.查询单词.添加词条.删除词条.将词典保存 ...
- Linux基于单链表环形队列的多线程生产者消费者模型
生产者–消费者模型简述 对于生产者–消费者模型,相信我们都不陌生,因为生活中,我们无时无刻不在扮演生产者或消费者.但是对于Linux中的生产者–消费者模型,大家又了解了一个什么程度? 其实,说白了就是 ...
- 单链表的应用---通讯录设计(数据结构课设)
一.实验目的 1)熟悉并掌握线性表的逻辑结构.物理结构: 2)熟悉并掌握线性链表的存储结构.基本操作和具体函数的定义: 二.实验内容 设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功 ...
- 数据结构单链表实现班级考勤管理系统
概述 运行环境 编译器:Intelij IDEA2020.3.2.x64 java环境:jdk11 基本原理,技术 首先,本程序采用的是图形界面输出,通过表格显示考勤及统计信息.为了可以长久保存考勤信 ...
- 【c语言课程设计】基于单链表与结构体的学生奖学金评定系统(菜单操作)
编写C程序,实现以下功能: 1)每名学生信息包括:学号(8个字符).姓名(最多20个字符).5门课程成绩(整型).总成绩(整型). 2)声明结构体类型用以保存学生信息. 3)从键盘读入全班同学的信息( ...
- 基于单链表的生产者消费者问题
『生产者与消费者问题分析』 「原理」生产者生产产品,消费者消费产品.产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者 就必须等待.同样的,如果生产者生产了产品,而消 ...
- lru算法c语言实现单链表,基于单链表实现LRU算法
基本思路: 1.如果数据已经在链表中已经存在了,则直接删除原数据,再插入头结点 2.若链表中不在: 2.1 若链表容量未满,则直接插入头结点 2.2 若链表容量已满,则先删除尾结点,再插入头结点 代码 ...
最新文章
- idea 自定义工具栏
- linux系统备份路径,linux系统备份恢复到本机或是别的机器上
- 在Windows 7中设置Java开发环境
- windows修改远程桌面RDP连接数
- java二维数组的遍历
- php软件开发--公众平台
- Spring 核心控制器DispatcherServlet(二)
- 巧用CSS居中未知高度的块元素
- 使用spss做各种相关性分析的方法和步骤
- otool 和 install_name_tool
- 扫码器 android 采集,caiPDA条码扫描采集器
- LDR6028充电OTG直播线直播声卡音频转接器最具性价比方案
- php动态效果,jquery+php实现动态数字显示效果
- 山东交通学院院计算机答辩,山东交通学院教务处关于做好2018届本科毕业生毕业设计(论文)工作的通知...
- 楚氏春秋(新版)第一部 风起平原
- 【CUDA 基础】4.3 内存访问模式
- SSM基于java的线上阅读平台的设计与实现 毕业设计-附源码291023
- 第十一周OJ-Q50解题方法
- 磁场检测传感器的设计
- java信用卡卡号算法,java实现主要信息的加密解密(模拟信用卡号的保存)
热门文章
- Replays For SC2 LOG
- MSCRM中报表开发二:创建基于FetchXML报表
- JavaScript4——DOM编程
- 前端使用navigator.mediaDevices.getUserMedia和window.MediaRecorder实现调用摄像头录制视屏
- pyqt5实现在IE内核下打开web界面,并实现自动解除IE安全策略问题。
- 大数据查询平台分享给大家!
- mysql中的restrict_数据库中restrict和casecade是什么意思?
- 各种ADSL猫初始地址及用户名密码
- 项目总结(input输入框type设置为number,maxlength无效,设置为tel,maxlength有效)
- Easy AR简单教程