以学生管理系统来巩固动态链表的学习
1配置头文件与源文件
在link.cpp
中写我们进行链表操作的主要代码
help()
方法包含了用户的界面帮助
#include"link.h"
//帮助文档
void help()
{
cout << "********************************" << endl;
cout << "help:帮助信息 *" << endl;
cout << "insert:插入链表结点 *" << endl;
cout << "print:遍历链表 *" << endl;
cout << "search:查询链表某个节点 *" << endl;
cout << "delete:删除列表某个节点 *" << endl;
cout << "free:释放整个链表 *" << endl;
cout << "quit:退出程序 *" << endl;
cout << "cls:清屏 *" << endl;
cout << "********************************" << endl;
}
在main.cpp
中写主函数:所要进行的操作调用什么方法
第一步我们先进行一下简单的测试
#include<iostream>
#include"link.h" //主函数要使用link.cpp 要包含link.h头文件
using namespace std;
int main(int argc, char* argv[])
{
help();
//输入用户指令
while (1)
{
char cmd[64] = "";
cout << "输入操作指令";
cin >> cmd;
if (strcmp(cmd,"help") ==0)
{
help();
}
else if (strcmp(cmd, "insert") == 0)
{
cout << "----------insert---------" << endl;
}
else if (strcmp(cmd, "print") == 0)
{
cout << "----------print----------" << endl;
}
else if (strcmp(cmd, "search") == 0)
{
cout << "----------search---------" << endl;
}
else if (strcmp(cmd, "delete") == 0)
{
cout << "----------delete---------" << endl;
}
else if (strcmp(cmd, "free") == 0)
{
cout << "----------free---------" << endl;
}
else if (strcmp(cmd, "cls") == 0)
{
system("cls");
}
else if (strcmp(cmd, "quit") == 0)
{
exit(-1);//return 0;
}
}
return 0;
}
在link.h
中写link.cpp
所需的头文件
#pragma once //声明
#ifndef LINK_H
#define LINK_H
#include<iostream>
using namespace std;
extern void help(void);//添加link.cpp外部声明关键词为extern
#endif // DEBUG
2插入
2.1定义链表节点类型
在link.h
头文件中定义链表类型结构体
//定义链表节点类型
struct STU
{
//数据域
int num;
char name[32];
//指针域
struct STU *next;
};
同时在main.h
中定义表头结点
struct STU* head = NULL; //定义链表头来定位在哪个链表上进行操作
2.2修改主函数插入入口
else if (strcmp(cmd, "insert") == 0)
{
cout << "请输入要插入的节点信息(num,name):" ;
STU tmp;
cin >> tmp.num >> tmp.name;
head = insertLink(head,tmp);//将tmp插入到以head为表头节点的链表之中,之后并更新表头节点
}
2.3添加操作
//有序插入
STU* insertLink(STU* head, STU tmp)
{
//从堆中申请待插入的节点空间
STU* pi = new STU;
//给pi赋值
*pi = tmp;
pi->next = NULL;
//判断链表是否为空
if (head == NULL)
{
head = pi;
}
else
{
//寻找插入点
STU* ph = head, * pb = head;
while ((pb->num < pi->num) && (pb->next != NULL))
{
//ph保存pb的位置
ph = pb;
//pb移动到下一节点
pb = pb->next;
}
//判断插入点的位置
if (pb->num >= pi->num) //头部、中部插入
{
if (pb == head) //头部插入
{
pi->next = head;
head = pi;
}
else//中部
{
ph->next = pi;
pi->next = pb;
}
}
else //尾部插入
{
pb->next = pi;
}
}
return head;
}
#endif
2.4在link.h
头文件中添加
extern STU* insertLink(STU* head, STU tmp);
3遍历
3.1修改主函数插入入口
else if (strcmp(cmd, "print") == 0)
{
printLink(head);
}
3.3添加操作
//遍历链表
void printLink(STU* head)
{
//判断链表是否存在
if (head == NULL)
{
cout << "link not exist" << endl;
return;
}
STU* pb = head;
while (pb!=NULL)
{
cout << pb->num << " " << pb->name << endl;
pb = pb->next;
}
return ;
}
3.4在link.h
头文件中添加
extern void printLink(STU* head);
4查找
4.1修改主函数插入入口
else if (strcmp(cmd, "search") == 0)
{
cout << "输入查询的姓名" ;
char name[32]=" ";
cin >> name;
STU* ret = NULL;
ret = searchNote(head,name);//返回查找到节点
if (ret!=NULL)
{
cout << "num=" << ret->num << ",name=" << ret->name << endl;
}
}
4.2添加操作
//查找
STU* searchNote(STU* head, char* name)
{
//判断表是否存在
if (head==NULL)
{
cout << "为空表";
return NULL;
}
//逐个节点查询
STU* pb = head;
while ((strcmp(pb->name,name)!=0)&&(pb->next!=NULL))
{
pb = pb->next;
}
if(strcmp(pb->name, name) == 0)
{
return pb;
}
return NULL;
}
4.3在link.h
头文件中添加
extern STU* searchNote(STU* head, char* name);
5删除
5.1修改主函数插入入口
else if (strcmp(cmd, "delete") == 0)
{
cout << "输入删除的学号";
int num = 0;
cin >> num;
head = deleteNote(head, num);//删除的话有可能删除的是头节点,所以在这里要提前考虑更新头结点
}
5.2添加操作
//删除
STU* deleteNote(STU* head, int num)
{
//判断表是否存在
if (head == NULL)
{
cout << "为空表";
return NULL;
}
//先查询到再删除
//逐个元素比较
STU* pf = head, *pb = head;
//寻找插入点同时不要越界
while ((pb->num != num) && (pb->next != NULL))
{
pf = pb;
pb = pb->next;
}
if (pb->num==num)
{
if (pb==head)//头删
{
head = head->next;
}
else
{
pf->next = pb->next;
}
delete pb;
}
return head;
}
5.3在link.h
头文件中添加
extern STU* deleteNote(STU* head, int num);
6释放
6.1修改主函数插入入口
else if (strcmp(cmd, "free") == 0)
{
freeLink(head);
}
6.2添加操作
STU* freeLink(STU* head)
{
//判断表是否存在
if (head == NULL)
{
cout << "为空表";
return NULL;
}
//逐个节点释放
STU* pb = head;
while (pb!=NULL)
{
head = head->next;
delete pb;
pb = head;
}
return head;
}
6.3在link.h
头文件中添加
extern STU* freeLink(STU* head);