存储结构选择及定义
链式存储,借助指针来表示元素之间的逻辑关系,优点是插入删除操作很方便,缺点是需要额外的存储空间来存放指针,访问元素时要从头节点开始遍历;
抽象出来的模型
随着信息技术的快速发展,信息管理变得越来越重要,传统的纸质通讯录管理方式已经无法满足日益现代化的需求。因此开发一个基于c语言的学生通讯录管理系统具有重要的实际意义。本课程设计旨在通过c语言实现一个学生通讯录管理系统,该系统能够为用户提供一种便捷的方式来存储、查询和删除学生的信息。
数据结构定义
线性表
选择线性表的优势:
线性表的长度可以灵活变动,可以方便快捷地添加插入新的联系人信息或者删除已有的联系人信息,方便了插入和删除工作;
线性表的物理结构单一,遍历方便快捷,大大加快了访问效率;这一操作也方便了后续的查询和修改工作;
逻辑结构定义
选择线性表,抽取的数据对象为学生,组成学生的数据项有学号,姓名,电话,住址等等,数据关系呈线性关系
存储结构选择及定义
链式存储,借助指针来表示元素之间的逻辑关系,优点是插入删除操作很方便,缺点是需要额外的存储空间来存放指针,访问元素时要从头节点开始遍历;
抽象出来的模型
插入部分的流程图:
修改部分的流程图:
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct
{
char num[11]; //将编号数组大小修改为6, 以容纳字符串结尾的’\0’
char name[10]; //将姓名数组大小修改为10, 以容纳字符串结尾的’\0’
char sex[4]; //将性别数组大小修改为4, 以容纳字符串结尾的’\0’
char phone[14];//将电话数组大小修改为14, 以容纳字符串结尾的”\0’
char addr[32]; // 将地址数组大小修改为32, 以容纳字符串结尾的’\0’
} DataType;
typedef struct node
{
DataType data;
struct node* next;
} ListNode;
typedef ListNode* LinkList;
void CreateList (LinkList* L,int m)
{
int i;
LinkList s, r;
*L=(LinkList)malloc(sizeof(ListNode));
(*L)->next=NULL;
r=*L;
for (i=0;i<m;i++)
{
s= (LinkList)malloc(sizeof(ListNode));
printf("\n输入第%d位学生的学号:", i+1);
scanf("%10s",s->data.num); //读取最多10个字符到编号数组
printf("\n输入第%d位学生的姓名:", i+1);
scanf("%9s",s->data.name); //读取最多9个字符到姓名数组
printf("\n输入第%d位学生的性别:", i+1);
scanf("%3s",s->data.sex); //读取最多3个字符到性别数组
printf("\n输入第%d位学生的电话:", i+1);
scanf("%13s",s->data.phone);//读取最多13个字符到电话数组
printf("\n输入第%d位学生的地址:", i+1);
scanf("%31s",s->data.addr); //读取最多31个字符到地址数组
s->next = NULL;
r->next=s;
r=s;
}
}
ListNode* LocateElem(LinkList L, char name[]) {
LinkList p = L->next;
while (p != NULL) {
if (strcmp(p->data.name, name) == 0) {
return p;
}
p = p->next;
}
return NULL; // 如果没有找到匹配的学生,返回 NULL
}
void ModifyElem(LinkList L, char name[], DataType newData) {
ListNode* p = LocateElem(L, name);
if (p != NULL) {
p->data = newData; // 如果找到学生,修改其信息
printf("学生信息已成功修改!\n");
} else {
printf("未找到名为 %s 的学生!\n", name);
}
}
int ListLength (LinkList L)
{
LinkList p;
int length=0;
p=L->next;
while (p)
{
length++;
p=p->next;
}
return length;
}
int ListInsert (LinkList* L, int i, DataType d)
{
LinkList p, s;
int length;
length = ListLength(*L);
p=(*L)->next;
int j=1;
if (!p || i>length +1)
return 0;
while (p &&j<i-1)
{
p=p->next;
j++;
}
s = (LinkList)malloc(sizeof (ListNode));
s->data=d;
s->next=p->next;
p->next=s;
return 1;
}
int ListDelete(LinkList* L,int i)
{
LinkList p, q;
p=*L;
int j=0;
int length;
length=ListLength(*L);
if (!p || i>length)
return 0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
printf("\n被删除的学生信息为:\n");
printf("学号:%s 姓名:%s 性别:%s 电话:%s 地址:%s",q->data.num, q->data.name, q->data.sex, q->data.phone, q->data.addr);
p->next = q->next;
free(q);
return 1;
}
int Getelem(LinkList L, char Name[], DataType* d)
{
LinkList p;
p = L->next;
while (p)
{
if(strcmp(p->data.name, Name) == 0)
{
*d = p->data;
return 1;
}
p = p->next;
}
return 0;
}
void print (LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("\n学号:%s 姓名:%s 性别:%s 电话:%s 地址:%s", p->data.num, p->data.name, p->data.sex,p->data.phone,p->data. addr);
p=p->next;
}
}
void menu()
{
printf("---------------1.学生信息的录入---------------");
printf("\n---------------2.学生信息的插入---------------");
printf("\n---------------3.学生信息的查询---------------");
printf("\n---------------4.学生信息的删除---------------");
printf("\n---------------5.学生信息的输出---------------");
printf("\n---------------6.学生信息的修改---------------");
printf("\n---------------0.退出管理系统-----------------");
}
int main()
{
LinkList L;
DataType d, d1;
int m, location, length, choose;
char Name[10];
menu();
p:
printf("\n请输入你的选项:");
scanf("%d",&choose);
switch (choose)
{
case 1:
printf("\n请输入通讯录人数:");
scanf("%d",&m);
CreateList(&L,m);
goto p;
case 2:
printf("\n输入要插入的位置:");
scanf("%d",&location);
printf("\n输入插入学生的学号:");
scanf("%10s",d.num);
printf("\n输入插入学生的姓名:");
scanf("%9s",d.name);
printf("\n输入插入学生的性别:");
scanf("%3s",d.sex);
printf("\n输入插入学生的电话:");
scanf("%13s",d.phone);
printf("\n输入插入学生的地址:");
scanf("%31s",d.addr);
ListInsert (&L, location, d);
goto p;
case 3:
printf("\n请输入要查询的学生姓名:");
scanf("%9s", Name);
if(Getelem(L, Name, &d))
{
printf("\n查询到的人员信息为:\n");
printf("\n学号:%s 姓名:%s 性别:%s 电话:%s 地址:%s", d.num, d.name, d.sex, d.phone, d.addr);
}
else
{
printf("\n未找到该姓名的学生信息。\n");
}
goto p;
case 4:
printf("\n输入要删除的姓名:");
scanf("%d",&location);
ListDelete(&L, location);
goto p;
case 5: print(L);
goto p;
case 6:
DataType newData;
char newName[10];
printf("\n请输入要修改的学生姓名:");
scanf("%9s", newName);
// 首先获取新数据
printf("\n请输入新的学号:");
scanf("%10s", newData.num);
printf("\n请输入新的姓名:");
scanf("%9s", newData.name);
printf("\n请输入新的性别:");
scanf("%3s", newData.sex);
printf("\n请输入新的电话:");
scanf("%13s", newData.phone);
printf("\n请输入新的地址:");
scanf("%31s", newData.addr);
ModifyElem(L, newName, newData);
goto p;
case 0:
printf("\n系统已退出。");
break;
default:
printf("\n输入错误,请重新输入");
goto p;
}
return 0;
}
如果有写的不对或者不好的地方恳请大家的批评指正