学生通讯录管理系统,主要是建立线性表,在线性表中进行插入,删除,修改,查找等操作,
- 新增功能:在链表尾部插入新节点。
- 删除功能:根据姓名在链表中删除对应节点。
- 打印功能:遍历链表打印所有人员信息。
- 查找功能:根据姓名查找对应节点并输出信息。
- 文件保存功能:将链表中的人员信息保存到文件。
- 文件读取功能:从文件中读取人员信息并加载到链表中。
- 排序功能:根据人员编号进行冒泡排序。
- 修改功能:根据人员编号修改指定人员的姓名、手机号和地址。
- 插入功能:根据人员姓名插入位置;
根据下面进行实现
- insertBytail(head, data):在链表尾部插入新节点。
- deleteNode(head, name):根据姓名删除节点。
- display(head):打印链表中的所有人员信息。
- find(head, name):根据姓名查找对应节点。
- save(head):将链表中的人员信息保存到文件。
- show():从文件中读取人员信息并加载到链表。
- bubbleSort(head):根据人员编号进行冒泡排序。
- xg(head, targetID):根据人员编号修改指定人员的姓名、手机号和地址。
- cr(list,info,name):根据人员姓名插入指定位置
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include<string.h>
struct people{
int id;
char name[10];
int phone;
char address[20];
};
struct Node{
struct people data; //数据域
struct Node *next; //指针域
};
struct Node* initList(){
//创建头结点 ,头结点并不存放数据,仅仅用来对链表进行操作
struct Node *head = (struct Node*)malloc(sizeof(struct Node));
head->next = NULL; //初始化头结点
return head;
}
void display(struct Node* head)
{
struct Node *p = head->next;
if(p==NULL)
{
printf("未录入\n");
}
while(p)
{
printf("编号:%d 姓名 %s 手机号 %d 地址 %s\n",p->data.id, p->data.name, p->data.phone, p->data.address);
p = p->next;
}
printf("\n");
}
void insertBytail(struct Node* head, struct people data)
{
//创建插入结点
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
struct Node *p = head;//p指向头结点
struct Node *pre = NULL;//pre存储p指针的前一个结点
while(p != NULL)
{
if(p->data.id==data.id)
{
printf("编号重复\n");
break;
}
if(p->data.phone==data.phone)
{
printf("手机号重复请检查\n");
break;
}
pre = p;
p = p->next;//p不为空时不断后移
}
//p为空时,pre指向尾结点
pre -> next = newNode;//将新结点插入到尾结点后面
}
void deleteNode(struct Node* head, char name[10])
{
//创建工作指针p,遍历链表
struct Node *p = head;//p指向头结点
struct Node *pre = NULL;//pre存储p指针的前一个结点
while(p != NULL)
{
int a=strcmp(p->data.name , name);
if(a==0)//找到要删除的结点
break;
else{//没有找到
pre = p;//记录p指针的前一个结点
p = p->next;
}
}
if(p != NULL) //找到该结点为头结点或者中间结点
{
pre->next = p->next;
printf("删除成功!!!!\n");
free(p);
}
else{//没找到
printf("没有找到对应信息,无法删除\n");
}
}
void find(struct Node* head, char name[10])
{
struct Node *p = head; // p指向头结点
struct Node *pre = NULL; // pre存储p指针的前一个结点
while(p != NULL)
{
int a = strcmp(p->data.name , name);
if(a == 0) //找到寻找的结点
{
printf("已找到!!!\n");
printf("姓名:%9s手机号:%10d地址:%10s\n", p->data.name, p->data.phone, p->data.address);
break;
}
else { //没有找到
pre = p; //记录p指针的前一个结点
p = p->next;
}
}
if(p != NULL) //找到该结点为头结点或者中间结点
{
}
else { //没找到
printf("未找到\n");
}
}
void xg(struct Node* head, int targetID) {
struct Node* p = head->next;
while (p != NULL) {
if (p->data.id == targetID) {
printf("请输入新的姓名:\n");
scanf("%s", p->data.name);
printf("请输入新的手机号:\n");
scanf("%d", &p->data.phone);
printf("请输入新的地址:\n");
scanf("%s",p->data.address);
printf("修改完成\n");
return ; // 表示修改成功
}
p = p->next;
}
printf("未找到匹配ID的人员\n");
// 表示未找到匹配的ID
}
void save(struct Node* head)//保存数据
{
// system("cls");
FILE *fp;
struct Node *p = head->next;
if((fp=fopen("D:\\dat.txt","w"))==NULL)
{
printf("未找到该文件\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"id:%d name:%s phone:%d address:%s\n",p->data.id,p->data.name,p->data.phone,p->data.address);
p=p->next;
}
printf("文件保存成功 \n");
fclose(fp);
}
void show()
{
FILE *fp;
fp=fopen("D:\\dat.txt","rb");
if(fp==NULL)
{
printf("未找到该文件\n");
exit(0);
}
while(!feof(fp))
{
printf("%c",fgetc(fp));
}
}
void bubbleSort(struct Node* head) {
int swapped;
struct Node *ptr1;
struct Node *lptr = NULL;
// 如果链表为空,直接返回
if (head->next == NULL) {
return;
}
do {
swapped = 0;
ptr1 = head->next;
while (ptr1->next != lptr) {
if (ptr1->data.id > ptr1->next->data.id) {
struct people temp = ptr1->data;
ptr1->data = ptr1->next->data;
ptr1->next->data = temp;
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
void cr(struct Node* head,struct people data,char name[10])
{
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
struct Node *p = head;//p指向头结点
struct Node *pre = NULL;//pre存储p指针的前一个结点
while(p != NULL)
{
int a=strcmp(p->data.name , name);
if(a==0)//找到寻找的结点
{
printf("已找到!!!\n");
// printf("姓名:%9s手机号:%10d地址:%10s\n ",p->data.id,p->data.name,p->data.phone,p->data.address);
// pre->data=data;
newNode->next = p->next;
p->next = newNode;
break;
}
else{//没有找到
pre = p;//记录p指针的前一个结点
p = p->next;
}
}
if(p != NULL) //找到该结点为头结点或者中间结点
{
}
else{//没找到
printf("未找到\n");
}
}
int main(){
struct Node *list = initList();
struct people info;
while(1)
{
printf("请输入选项:\n0-退出\t1-新增\t2-删除\t3-打印\t4-查找\t5-文件保存\t6-文件读取\t7-排序\t8-修改\t9-插入\n");
int choice ;
scanf("%d",&choice);
switch(choice){
case 1:{
printf("\n请输入 编号 姓名 手机号 地址:");
scanf(" %d %s %d %s",&info.id, &info.name, &info.phone, &info.address);
insertBytail(list, info);
break;
}
case 2:{
printf("\n请输入要删除姓名:");
char name[10];
scanf("%s", &name);
deleteNode(list, name);
break;
}
case 3:{
display(list);
break;
}
case 4:
{
printf("\n请输入要查找的姓名:");
char name[10];
scanf("%s", &name);
find(list,name);
break;
}
case 5:
{
save(list);
break;
}
case 6:
{
show();
break;
}
case 7:
{
bubbleSort(list);
printf("根据ID进行冒泡排序完成\n");
break;
}
case 8:
{
int b;
printf("请输入你要修改的编号\n");
scanf("%d",&b);
xg(list,b);
break;
}
case 0:
{
return 0;
}
case 9:
{
char nam[10];
printf("请输入你要插入姓名的后面\n");
scanf("%s",&nam);
printf("\n请输入 编号 姓名 手机号 地址:");
scanf(" %d %s %d %s",&info.id, &info.name, &info.phone, &info.address);
cr(list,info,nam);
break;
}
}
}
}