别人的期末作业。
对于信息的修改删除,既然要求用C语言来写, 老老实实用链表吧。
若想改变排序依据, 可对源码进行修改。
#include <stdio.h>
#include <stdlib.h>
struct person
{
long long id; // 身份证号码
char name[16]; // 姓名
char _adress[110]; // 地址
long long phone_num; // 电话号码
person* next;
};
person person_head = { 0 }; // 链表头
void insert(person* nowper)
{
person* now = person_head.next; // 当前节点
person* last = &person_head; // 上一个节点
while (now)
{
if (nowper->id > now->id) // 满足条件的插入位置
break;
last = now;
now = now->next; // 指向下一个对象
}
nowper->next = last->next; //
last->next = nowper;
}
void remove(long long id)// 按id查找并删除节点
{
person* now = person_head.next; // 当前节点
person* last = &person_head; // 上一个节点
while (now)
{
if (id == now->id) // 找到这个位置
{
last->next = now->next; // 将要删除后的节点后面的信息拼接
free(now); // 进行删除
break;
}
last = now;
now = now->next; // 向下找
}
}
void show_information(long long id) // 根据id 查找信息
{
int flag = 0;
person* now = person_head.next; // 当前节点
person* last = &person_head; // 上一个节点
while (now)
{
if (id == now->id) // 找到这个位置
{
printf("身份证号: %lld\n姓名: %s\n家庭地址: %s\n联系号码: %lld\n", now->id, now->name, now->_adress, now->phone_num);
flag = 1;
break;
}
last = now;
now = now->next; // 找到最后一个对象
}
if (!flag)
puts("未找到该用户!");
}
void update(long long id, int now_phone)
{
person* now = person_head.next; // 当前节点
person* last = &person_head; // 上一个节点
while (now)
{
if (id == now->id) // 找到这个位置
{
now->phone_num = now_phone;
break;
}
last = now;
now = now->next; // 向下找
}
}
void show_all()
{
int cnt = 0;
int flag = 0;
person* p = person_head.next;
while (p)
{
flag = 1;
printf("用户%d:\n身份证号: %lld\n姓名: %s\n家庭地址: %s\n联系号码: %lld\n", ++cnt, p->id, p->name, p->_adress, p->phone_num);
p = p->next; // 向下找
}
if (!flag)
puts("无信息");
}
int main()
{
puts("该系统按身份证号码从大至小排序");
puts("请输入n个人的信息(身份证号, 姓名, 地址, 电话号码)");
puts("先输入大小n");
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
person* nowper = (person*)malloc(sizeof person); // 申请内存
scanf("%lld%s%s%lld", &nowper->id, nowper->name, nowper->_adress, &nowper->phone_num);
insert(nowper);
}
while (true)
{
puts("0:退出操作");
puts("1:增加信息");
puts("2:删除信息");
puts("3:修改信息");
puts("4:查询信息");
puts("5:输出所有人的信息");
int op = 0;
scanf("%d", &op);
if (op == 0)
break;
if (op == 1)
{
person* nowper = (person*)malloc(sizeof person); // 申请内存
puts("依此输入身份证号, 姓名, 地址, 电话号码");
scanf("%lld%s%s%lld", &nowper->id, nowper->name, nowper->_adress, &nowper->phone_num);
insert(nowper);
}
else
if (op == 2)
{
puts("请输入删除人的身份证号进行删除");
long long id;
scanf("%lld", &id);
remove(id);
}
else
if (op == 3)
{
puts("请输入删除人的身份证号以及要修改的手机号");
long long id, now_phone;
scanf("%lld%lld", &id, &now_phone);
update(id, now_phone);
}
else
if (op == 4)
{
puts("请输入查询人的身份证号");
long long id = 0;
scanf("%lld", &id);
show_information(id);
}
else
{
show_all();
}
puts("输入任意数字进行下一次操作");
int nouse = 0;
scanf("%d", &nouse);
}
return 0;
}