数据结构第二次更新,记录了单链表的学习,上传了包括 整表创建,插入,删除,取值,查找,获取长度,反转链表,整表销毁 等函数的代码。敲码不易,求赞,求关注,更希望大家能对我的代码多加指正,谢谢!
AC代码:
#include<iostream>
#define ElemType int
#define Status int
#define OK 1
using namespace std;
// 单链表结点数据结构;
typedef struct LNode
{
ElemType data; // 数据域;
struct LNode *next; // 指针域;
}LNode, *LinkList;
// ***********************************基本操作函数********************************//
// 初始化函数
Status InitList(LinkList &L)
{
L=new LNode; // 生成头结点;
L->next=NULL; // 头结点指针域置空;
return OK;
}
// 创建函数----前插法;
bool CreateList_H(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *p;
for(int i=0; i<n; i++)
{
p = new LNode;
cin>>p->data;
p->next = L->next;
L->next = p;
}
return true;
}
// 创建函数---后插法
bool CreateList_R(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *r, *p;
r = L;
for(int i = 0; i<n; i++)
{
p = new LNode;
cin>>p->data;
p->next = NULL;
r->next = p;
r = p;
}
return true;
}
// 获取单链表长度 头结点无数据,不算
int ListLength(LinkList &L)
{
LinkList p = L;
int sum = 0;
while(p)
{
sum++;
p = p->next;
}
cout<<"该单链表的长度为:"<<sum-1<<endl;
return sum-1;
}
// 逆转函数
void InverseList(LinkList &L)
{
LNode *p = L->next;
L->next = NULL;
LNode *q;
while(p )
{
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
// 插入函数--后插法,插到第 i 个(1<=i<=length+1)位置 即 i-1 之后的位置,不必区分 i 的位置
bool ListInsert(LinkList &L, int i, ElemType e)
{
LNode *s;
LinkList p = L;
int j = 0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1)
{
cout<<"插入位置无效!!!"<<endl;
return false;
}
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
// 删除函数 删除位置 i 的结点 即删除 i-1 之后的结点
bool ListDelete(LinkList &L, int i)
{
LNode *s;
LinkList p = L;
int j = 0;
LinkList q;
while(p->next && j<i-1)
{
p = p->next;
j++;
}
if(!(p->next) || j>i-1)
{
cout<<"删除元素不存在!!!"<<endl;
return false;
}
q = p->next;
p->next = q->next;
free(q); // 释放已删除结点的空间;
return true;
}
// 查找函数 按值查找 查找第一个等于e的结点 成功返回该结点指针,否则返回NULL
LNode *LocateElem(LinkList &L, ElemType e)
{
LNode *p = L;
while(p && (p->data != e))
{
p = p->next;
}
if(p)
{
cout<<"查找成功!该元素的地址为:"<<p<<endl;
}
return p;
}
// 取值函数 获取第 i 个元素的数据
Status GetElem(LinkList &L, int i)
{
LNode *p = L->next;
int j = 1;
while(p && j<i)
{
p = p->next;
j++;
}
if(!p || j>i)
{
return false;
}
cout<<"取值成功!该元素为:"<<p->data<<endl;
return true;
}
// 销毁函数 删除整个单链表
Status ClearList(LinkList &L)
{
LinkList p, q;
p = L->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return true;
}
//********************************功能实现函数************************************//
// 遍历输出函数
void PrintList(LinkList L)
{
LinkList p = L->next; // 跳过头结点;
if(p)
{
cout<<"当前单链表所有元素为:";
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
else
{
cout<<"当前单链表已空!"<<endl;
}
}
// 创建功能函数---前插法
void Create_H(LinkList &L)
{
int n;
bool flag;
cout<<"请输入你要创建单链表的长度:";
cin>>n;
cout<<"请输入你要创建单链表的元素:";
flag = CreateList_H(L, n);
if(flag)
{
cout<<"创建成功!"<<endl;
PrintList(L);
}
}
// 创建功能函数---后插法
void Create_R(LinkList &L)
{
int n;
bool flag;
cout<<"请输入你要创建的单链表的长度:";
cin>>n;
cout<<"请输入你要创建的单链表的元素:";
flag = CreateList_R(L, n);
if(flag)
{
cout<<"创建成功!"<<endl;
PrintList(L);
}
}
// 获取长度功能函数
void GetLength(LinkList &L)
{
ListLength(L);
}
// 插入功能函数 调用ListInsert后插
void Insert(LinkList &L)
{
int place; ElemType e; bool flag;
cout<<"请输入要插入的位置(从1开始)及元素:";
cin>>place>>e;
flag = ListInsert(L, place, e);
if(flag)
{
cout<<"插入成功!"<<endl;
PrintList(L);
}
}
// 删除功能函数 调用ListDelete删除
void Delete(LinkList &L)
{
int place; bool flag;
cout<<"请输入要删除的位置(从1开始):";
cin>>place;
flag = ListDelete(L, place);
if(flag)
{
cout<<"删除成功!"<<endl;
PrintList(L);
}
}
// 查找功能函数 调用LocateElem函数查找
void Search(LinkList &L)
{
ElemType e; LNode *q;
cout<<"请输入要查找的值:";
cin>>e;
q = LocateElem(L, e);
if(!q)
cout<<"查找失败!"<<endl;
}
// 取值功能函数 调用GetElem取值
void Get(LinkList &L)
{
int place; bool flag;
cout<<"请输入你要获取元素的位置(从1开始):";
cin>>place;
flag = GetElem(L, place);
if(!flag)
cout<<"取值失败!"<<endl;
}
// 逆转功能函数 调用InverseList 反转单链表
void Inverse(LinkList &L)
{
cout<<"反转成功!"<<endl;
InverseList(L);
PrintList(L);
}
// 销毁功能函数 调用ClearList 销毁
void Clear(LinkList &L)
{
bool flag;
flag = ClearList(L);
if(flag)
cout<<"销毁成功!"<<endl;
}
// 菜单
void menu()
{
cout<<"********1.创建--前插 2.创建--后插********"<<endl;
cout<<"********3.插入 4.删除 ********"<<endl;
cout<<"********5.查找 6.取值 ********"<<endl;
cout<<"********7.长度 8.逆转 ********"<<endl;
cout<<"********9.销毁 0.退出 ********"<<endl;
}
int main()
{
LinkList L; int choice;
InitList(L);
while(1)
{
menu();
cout<<"请输入你要进行的操作的序号:";
cin>>choice;
if(choice == 0)
break;
switch(choice)
{
case 1: Create_H(L); break;
case 2: Create_R(L); break;
case 3: Insert(L); break;
case 4: Delete(L); break;
case 5: Search(L); break;
case 6: Get(L); break;
case 7: GetLength(L); break;
case 8: Inverse(L); break;
case 9: Clear(L); break;
default : cout<<"输入错误!"<<endl;
}
}
return 0;
}