[问题描述]

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

[基本要求]

(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;}}
}

结果展示:

基于单链表的班级通讯录相关推荐

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

    Class Community Book程序快捷目录 注意 文字描述 问题描述 基本要求 代码部分 头文件 主程序 功能程序 注意 本程序由VS2019编写,属于记录学习过程,仍有许多问题尚未解决. ...

  2. c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统

    前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...

  3. C语言基于单链表的词典软件

    C语言基于单链表的词典软件 实验1: 日期:2022-10-4 类型:设计型 题目:基于单链表的词典软件 内容: 利用单链表存储词典,可以实现从文件中加载数据.查询单词.添加词条.删除词条.将词典保存 ...

  4. Linux基于单链表环形队列的多线程生产者消费者模型

    生产者–消费者模型简述 对于生产者–消费者模型,相信我们都不陌生,因为生活中,我们无时无刻不在扮演生产者或消费者.但是对于Linux中的生产者–消费者模型,大家又了解了一个什么程度? 其实,说白了就是 ...

  5. 单链表的应用---通讯录设计(数据结构课设)

    一.实验目的 1)熟悉并掌握线性表的逻辑结构.物理结构: 2)熟悉并掌握线性链表的存储结构.基本操作和具体函数的定义: 二.实验内容 设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功 ...

  6. 数据结构单链表实现班级考勤管理系统

    概述 运行环境 编译器:Intelij IDEA2020.3.2.x64 java环境:jdk11 基本原理,技术 首先,本程序采用的是图形界面输出,通过表格显示考勤及统计信息.为了可以长久保存考勤信 ...

  7. 【c语言课程设计】基于单链表与结构体的学生奖学金评定系统(菜单操作)

    编写C程序,实现以下功能: 1)每名学生信息包括:学号(8个字符).姓名(最多20个字符).5门课程成绩(整型).总成绩(整型). 2)声明结构体类型用以保存学生信息. 3)从键盘读入全班同学的信息( ...

  8. 基于单链表的生产者消费者问题

    『生产者与消费者问题分析』 「原理」生产者生产产品,消费者消费产品.产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者             就必须等待.同样的,如果生产者生产了产品,而消 ...

  9. lru算法c语言实现单链表,基于单链表实现LRU算法

    基本思路: 1.如果数据已经在链表中已经存在了,则直接删除原数据,再插入头结点 2.若链表中不在: 2.1 若链表容量未满,则直接插入头结点 2.2 若链表容量已满,则先删除尾结点,再插入头结点 代码 ...

最新文章

  1. idea 自定义工具栏
  2. linux系统备份路径,linux系统备份恢复到本机或是别的机器上
  3. 在Windows 7中设置Java开发环境
  4. windows修改远程桌面RDP连接数
  5. java二维数组的遍历
  6. php软件开发--公众平台
  7. Spring 核心控制器DispatcherServlet(二)
  8. 巧用CSS居中未知高度的块元素
  9. 使用spss做各种相关性分析的方法和步骤
  10. otool 和 install_name_tool
  11. 扫码器 android 采集,caiPDA条码扫描采集器
  12. LDR6028充电OTG直播线直播声卡音频转接器最具性价比方案
  13. php动态效果,jquery+php实现动态数字显示效果
  14. 山东交通学院院计算机答辩,山东交通学院教务处关于做好2018届本科毕业生毕业设计(论文)工作的通知...
  15. 楚氏春秋(新版)第一部 风起平原
  16. 【CUDA 基础】4.3 内存访问模式
  17. SSM基于java的线上阅读平台的设计与实现 毕业设计-附源码291023
  18. 第十一周OJ-Q50解题方法
  19. 磁场检测传感器的设计
  20. java信用卡卡号算法,java实现主要信息的加密解密(模拟信用卡号的保存)

热门文章

  1. Replays For SC2 LOG
  2. MSCRM中报表开发二:创建基于FetchXML报表
  3. JavaScript4——DOM编程
  4. 前端使用navigator.mediaDevices.getUserMedia和window.MediaRecorder实现调用摄像头录制视屏
  5. pyqt5实现在IE内核下打开web界面,并实现自动解除IE安全策略问题。
  6. 大数据查询平台分享给大家!
  7. mysql中的restrict_数据库中restrict和casecade是什么意思?
  8. 各种ADSL猫初始地址及用户名密码
  9. 项目总结(input输入框type设置为number,maxlength无效,设置为tel,maxlength有效)
  10. Easy AR简单教程