单链表实现通讯录的增删改查和排序
代码功能概述:
- 联系人结构体存储学号、姓名、电话
- 创建学生信息表
- 插入学生信息
- 删除学生信息
- 按学生的姓名查找学生信息,并返回学生结点的地址
- 按学生的学号查找学生信息,并返回学生的详细信息
- 遍历通讯录信息表
- 整表清空(带头结点)
- 整表销毁(不带头结点)
- 按学号排序学生的位置
- 退出操作
/*
@sarexpine
*/
#include <iostream>
#include <iomanip>
using namespace std;
struct Student
{
int id;
string name;
string phoneNumber;
};
struct Node
{
struct Student array;
struct Node* next;
};
typedef struct Node LNode;
typedef struct Node* LinkList;
//初始化
void InitLinkList(LinkList& L)
{
L = new LNode;
L->next = NULL;
}
void InitStudent(Student& s)
{
s.id = 0;
s.name = "NULL";
s.phoneNumber = "NULL";
}
//头插法创建单链表
void creatLinkList_H(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
LNode* p;
cout << "请依次输入" << n << "位学生的学号、姓名、电话号码:" << endl;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->next = NULL;
cin >> p->array.id;
cin >> p->array.name;
cin >> p->array.phoneNumber;
p->next = L->next;
L->next = p;
}
system("pause");
system("cls");
}
//尾插法创建单链表
void creatLinkList_F(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
LNode* p;
LNode* r;
r = L;
cout << "请依次输入" << n << "位学生的学号、姓名、电话号码:" << endl;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->next = NULL;
cin >> p->array.id;
cin >> p->array.name;
cin >> p->array.phoneNumber;
r->next = p;
p->next = NULL;
r = p;
}
system("pause");
system("cls");
}
void creatFunction(LinkList& L)
{
int n;
cout << "请输入你要创建的学生人数:" << endl;
cin >> n;
int choice;
cout << "请选择建立通讯录的方式:0-头插法 1-尾插法" << endl;
cin >> choice;
if (choice == 0)
{
creatLinkList_H(L, n);
}
else
{
creatLinkList_F(L, n);
}
}
//插入元素
int insertElem(LinkList& L, int i, struct Student s1)
{
int k;
LNode* p;
LNode* s;
p = L;
k = 1;
while (p != NULL && k < i)
{
p = p->next;
k++;
}
if (p == NULL || k > i)
{
cout << "插入失败!位置不存在!" << endl;
return 0;
}
s = new LNode;
s->array.id = s1.id;
s->array.name = s1.name;
s->array.phoneNumber = s1.phoneNumber;
s->next = p->next;
p->next = s;
cout << "插入成功!" << endl;
system("pause");
system("cls");
return 1;
}
void insertFunction(LinkList& L)
{
int n;
cout << "请输入插入位置:" << endl;
cin >> n;
struct Student s1;
cout << "请输入学生的学号、姓名、电话号码:" << endl;
cin >> s1.id;
cin >> s1.name;
cin >> s1.phoneNumber;
insertElem(L, n, s1);
}
//删除元素
int deleteElem(LinkList& L, int i, struct Student* recover)
{
int k = 1;
LNode* p; //工作指针
LNode* q; //备份被删除结点
p = L;
while (p->next != NULL && k < i)
{
p = p->next;
k++;
}
if (p->next == NULL || k > i)
{
cout << "删除失败!删除位置不合法!" << endl;
system("pause");
system("cls");
return 0;
}
q = p->next;
p->next = q->next;
recover->id = q->array.id;
recover->name = q->array.name;
recover->phoneNumber = q->array.phoneNumber;
cout << "删除成功!第" << i << "位学生已被删除,他的信息是:" << endl;
cout << left << "学号:" << setw(5) << recover->id << "\t"
<< left << "姓名:" << setw(15) << recover->name << "\t"
<< left << "电话:" << setw(15) << recover->phoneNumber << endl;
delete q;
system("pause");
system("cls");
return 1;
}
void deleteFunction(LinkList& L)
{
int i;
cout << "请输入你要删除学生序号:" << endl;
cin >> i;
struct Student recovery;
deleteElem(L, i, &recovery);
}
//读取元素
int GetElem(LinkList L, int i, struct Student s)
{
int j;
LNode* p;
p = L->next;
j = 1;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
if (p == NULL || j > i)
{
cout << "查找失败!没有该学生!" << endl;
system("pause");
system("cls");
return 0;
}
s.id = p->array.id;
s.name = p->array.name;
s.phoneNumber = p->array.phoneNumber;
cout << "查找成功!第" << i << "个位置的学生信息为:" << endl;
cout << left << "学号:" << setw(5) << s.id << "\t"
<< left << "姓名:" << setw(15) << s.name << "\t"
<< left << "电话:" << setw(15) << s.phoneNumber << endl;
system("pause");
system("cls");
return 1;
}
void getFunction(LinkList L)
{
int find;
cout << "请输入你要查找的位置:" << endl;
cin >> find;
struct Student s1;
GetElem(L, find, s1);
}
//查找元素(按值查找)
LNode* LocateElem(LinkList L, string e)
{
LNode* p;
p = L->next;
while (p != NULL && p->array.name != e)
{
p = p->next;
}
return p; //返回结点的地址
}
void locateFunction(LinkList L)
{
string locateElem;
cout << "请输入你要查找的学生姓名:" << endl;
cin >> locateElem;
cout << LocateElem(L, locateElem);
system("pause");
system("cls");
}
//整表清空
void clearLinkList(LinkList& L)
{
LNode* p;
LNode* q;
p = L->next;
while (p != NULL)
{
q = p->next;
delete p;
p = q;
}
L->next = NULL;
cout << "销毁通讯录操作完成!" << endl;
system("pause");
system("cls");
}
//排序单链表为有序表(升序)
void insertSortLinkList(LinkList& L)
{
LNode* pre, * p, * q;
p = L->next->next;
L->next->next = NULL;
while (p != NULL)
{
q = p->next;
pre = L;
while (pre->next != NULL && pre->next->array.id < p->array.id)
{
pre = pre->next;
}
//进行插入排序
p->next = pre->next;
pre->next = p;
p = q; //指针后移
}
system("pause");
system("cls");
}
//销毁链表
void destoryLinkList(LinkList& L)
{
LNode* pre;
LNode* p;
pre = L;
p = L->next;
//销毁操作
while (p != NULL)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
system("pause");
system("cls");
}
//遍历数组
void printLinkList(LinkList L)
{
LNode* p;
p = L->next;
cout << "学生信息表:" << endl;
while (p != NULL)
{
cout << left << "学号:" << setw(5) << p->array.id << "\t"
<< left << "姓名:" << setw(15) << p->array.name << "\t"
<< left << "电话:" << setw(15) << p->array.phoneNumber << endl;
p = p->next;
}
cout << endl;
system("pause");
system("cls");
}
void showMenu()
{
cout << "--------------------------" << endl;
cout << "--------1.创建链表--------" << endl;
cout << "--------2.插入元素--------" << endl;
cout << "--------3.删除元素--------" << endl;
cout << "--------4.按值查找--------" << endl;
cout << "--------5.读取元素--------" << endl;
cout << "--------6.遍历链表--------" << endl;
cout << "--------7.整表清空--------" << endl;
cout << "--------8.排序链表--------" << endl;
cout << "--------9.销毁链表--------" << endl;
cout << "--------0.退出操作--------" << endl;
cout << "--------------------------" << endl;
}
int main()
{
LinkList L;
InitLinkList(L);
Student s;
InitStudent(s);
int selection;
while (true)
{
showMenu();
cin >> selection;
switch (selection)
{
case 1:
creatFunction(L);
break;
case 2:
insertFunction(L);
break;
case 3:
deleteFunction(L);
break;
case 4:
locateFunction(L);
break;
case 5:
getFunction(L);
break;
case 6:
printLinkList(L);
break;
case 7:
clearLinkList(L);
break;
case 8:
insertSortLinkList(L);
break;
case 9:
destoryLinkList(L);
break;
case 0:
cout << "欢迎下次使用!" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
}
/*
@sarexpine
*/