我的注释写的花里胡哨的是为了我自己理解的,这是我的数据结构实验报告
#include<iostream>
using namespace std;
#define ERROR -1
#define OK 1
typedef int ElemType;
typedef int Status;
// 结点定义
typedef struct LNode {//链表有两个数据域一个存指针一个存数据
ElemType data; // 数据域
struct LNode *next; // 指针域 struct LNode这种类型的指针
} Lnode, *LinkList;//新的数据类型Lnode
//1.用尾插法构造单链表,新结点插入在单链表尾结点之后
//用户依次输入 n 个数据元素
void CreateListTail(LinkList &L, int n)
{
L = (LinkList)malloc(sizeof(LNode));//动态分布一个结点
L->next = NULL;//先建立一个带头节点的单链表
Lnode *p,*q;//定义一个指向该类型的指针 q指向终端结点
q = L;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
cin >> p->data;//输入数据
q->next = p;
q = q->next;//q指向终端结点
}
q->next = NULL;//终端结点最后一个指向空
}
//2.用头插法构造单链表,新结点插入在单链表头结点之后
//用户依次输入 n 个数据元素
void CreateListHead(LinkList &L, int n)
{
L = (LinkList)malloc(sizeof(LNode));//动态分布一个结点
L->next = NULL;
Lnode *p;
for (int i = 0; i < n; i++)
{
p= (LinkList)malloc(sizeof(LNode));
cin >> p->data;
p->next = L->next;//因为 L->next就是头结点指向下一个,现在让p->next代替L->next的位置,二者是等价关系
L ->next= p;//头节点改变位置,使p成为新的头结点(还是没懂)
}
}
//3.返回单链表中第 i 个结点的值
Status GetElem(LinkList &L, int i, ElemType &e)
{
Lnode *p;
int j = 0;
p = L->next;
while (p&&j<i) {
e = p->data;
p = p->next;
j++;
}
return e;
}
//4.在单链表 i 位置之后插入元素 e
Status ListInsert(LinkList &L, int i, ElemType e)
{
Lnode *s;//指向i的指针
int j = 0;
s = L->next;
while (s&&j <i-1)
{
s = s->next;
++j;
}
Lnode *p;//定义一个指针
p = (LinkList)malloc(sizeof(LNode));//生成一个数据域用来插入
p->data = e;
p->next = s->next;
s->next = p;
return e;
}
//5.删除单链表中位于 i 位置的结点,成功输出"已删除第 i 个元素",
//失败则输出原因(栈为空,或者未找到第 i 个元素 )
Status ListDelete(LinkList &L, int i, ElemType &e)
{
Lnode *q,*p;
q = L; int j = 0;
while (q->next&&j < i - 1)
{
q = q->next;
j++;
}
if (!(q->next) || j > i - 1)
{
cout << "未找到第 i 个元素 ";
return ERROR;
}
else
{
p = q->next;//q就是当前结点的前趋地址,p是当前要删除的结点的地址
e = p->data;
q->next = p->next;
free(p);//释放点删除的结点
cout << "已删除第"<<i<<" 个元素";
}
return e;
}
//6.清空单链表
void ClearList(LinkList &L)
{
Lnode *p;
while (L->next)//当不为空指针的时候
{
p = L->next;
L->next=p->next;//p的下一个结点
delete p;
}
}
//7.遍历单链表 ,输出各个结点的值
void Traverse(LinkList &L)
{
Lnode *p;
p = L->next;
while (p)
{
cout << p->data<<" ";
p = p->next;
}
}
//8.销毁单链表
void DestroyList(LinkList &L)
{
Lnode *p;
while (L) {//L是不是还存在
p= L;
L = L->next;//移动指针
delete p;
}
}
//9.删除单链表中值为 e 的结点,成功输出"已删除 e 元素",
//失败则输出原因(栈为空,或者未找到 e 元素
int DeleteElem(LinkList &L, ElemType e)
{
Lnode *p,*temp;
p = L->next;
while (p)
{
temp = p;
p = p->next;
if (p->data == e)
{
temp->next = p->next;
free(p);
cout << "已删除 e 元素" << endl;
return OK;
}
}
cout << "栈为空,或者未找到 e 元素" << endl;
}
int main(void)
{
LinkList L;
ElemType e;
int c = 0;
while (c != 9) {
cout << endl << "1. 头插法创建单链表";
cout << endl << "2. 尾插法创建单链表";
cout << endl << "3. 在单链表中查找第 i 个元素";
cout << endl << "4. 在单链表中第 i 个位置插入元素";
cout << endl << "5. 在单链表中删除第 i 个元素";
cout << endl << "6. 在单链表中删除 e 元素";
cout << endl << "7. 遍历单链表";
cout << endl << "8. 销毁单链表";
cout << endl << "9. 退出";
cout << endl << "选择功能(1~9):";
cin >> c;
switch (c)
{
case 1: {
cout << "请输入数据个数";
int n;
cin >> n;
CreateListHead(L, n);
Traverse(L);
break; }
case 2: {
cout << "请输入数据个数";
int n;
cin >> n;
CreateListTail(L, n);
Traverse(L);
break; }
case 3: {
cout << "请输入要查找第几个元素";
int i;
cin >> i;
e=GetElem(L, i, e);
cout << e << endl;
Traverse(L);
break; }
case 4: {
cout << "请输入要插入的位置和插入的元素";
int i;
cin >> i>>e;
ListInsert(L, i, e);
Traverse(L);
break; }
case 5: {
cout << "请输入要删除第几位的数";
int i;
cin >> i;
ListDelete(L, i, e);
Traverse(L);
break; }
case 6: {
cout << "请输入要删除的元素";
cin >> e;
DeleteElem(L, e);
Traverse(L);
break; }
case 7: {
Traverse(L);
break; }
case 8: {
DestroyList(L);
break; }
case 9:break;
}
}
}