目录
🎡一、准备工作
还是老样子,首先介绍一下需要用到的头文件、赋值和重命名(C\C++通用)
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#define ERROR 0 //错误返回值
#define OK 1 //正确返回值
#define OVERFLOW -2 //失败返回值
using namespace std;
typedef int Status; //int的别名
typedef int ElemType; //int的别名
🎡二、定义链表结构
typedef struct Lnode //定义链表
{
ElemType date; //数据域
struct Lnode *next; //指针域
}Lnode,*LinkList; //Lnode用于定义结点,LinkList用于定义头指针
🎡三、函数声明
//初始化链表
Status InitList(LinkList &L);
//头插法插入元素
Status InsertFront(LinkList &L,int n);
//尾插法插入元素
Status InsertBack(LinkList &L,int n);
//按位置插入元素
Status ListInsert(LinkList &L,int pos,ElemType e);
//插入元素
Status ListInsertUp(LinkList &L,ElemType e);//此处为升序插入,降序插入则为ListInsertDown
//删除元素
Status ListDelete(LinkList &L,int pos);
//取值
Status GetElem(LinkList L,int pos,ElemType &e);
//查找元素位置
Status LocateElem(LinkList L,ElemType e);
//查找元素地址
Lnode *LocateElem2(LinkList L,ElemType e);
//输出链表
void ListShow(LinkList L);
//对链表元素进行排列
Status ListSortUp(LinkList &L); //此处为升序排序,降序排序则为ListSortDown
//清空单链表
Status ClearList(LinkList &L);
//销毁单链表
Status DestroyList(LinkList &L);
//计算链表表长
Status LengthList(LinkList L);
🎡四、基本操作的实现
✨1.初始化链表
实现原理:新建一个单链表结点,将指针域置为空
//初始化链表
Status InitList(LinkList &L)
{
L=new Lnode;
L->next=NULL;
return OK;
}
✨2.头插法插入元素
实现原理:创建一个新结点,将元素赋值到结点的数据域中,将头结点的指针域指向新结点,新节点的指针域指向原来的第一个结点
//头插法插入元素
Status InsertFront(LinkList &L,int n)
{
Status *a,i;
Lnode *p=L;
a=new Status[n]; //新建一个长度为n的数组
cout<<"请输入要插入的元素:";
for(i=0;i<n;i++)
cin>>a[i];
for(i=n-1;i>=0;i--)
{
Lnode *newnode=(struct Lnode*)malloc(sizeof(struct Lnode)); //新建一个结点
newnode->date=a[i]; //对数据域进行赋值
newnode->next=p->next; //尾结点指针域置为NULL
p->next=newnode; //对指针域进行赋值
}
return OK;
}
✨3.尾插法插入元素
实现原理:创建一个新结点,将元素赋值到结点的数据域中,将尾结点的指针域指向新结点,新节点的指针域置为空
//尾插法插入元素
Status InsertBack(LinkList &L,int n)
{
Status i;
Lnode *p=L;
for(i=0;i<n;i++)
{
while(p->next) p=p->next; //找到尾结点
Lnode *newnode;
newnode=new Lnode; //新建一个结点
cout<<"请输入第"<<i+1<<"个元素:";
cin>>newnode->date; //对数据域进行赋值
newnode->next=p->next; //尾结点指针域置为NULL
p->next=newnode; //对指针域进行赋值
}
return OK;
}
✨4.按位置插入元素
实现原理:找到要插入位置的前一个结点,改变该结点指针域的指向
//按位置插入元素
Status ListInsert(LinkList &L,int pos,ElemType e)
{
Lnode *p=L;
Status i=0; //i用于记录位置
while(p&&i<pos-1) {p=p->next; i++;} //若p不为空且i在要插入的位置前面
if(!p||i>pos-1) {cout<<"插入位置错误,插入失败!"<<endl; return ERROR;} //若p为空或插入位置错误,则给出提示
Lnode *s;
s=new Lnode;
s->date=e; s->next=p->next; p->next=s;
return OK;
}
✨5.按顺序插入元素
实现原理:找到元素要插入的位置,改变前一个结点的指针域
//按顺序插入元素
Status ListInsertUp(LinkList &L,ElemType e)
{
Lnode *p=L->next;
Lnode *q=L;
while(p->date<e) //此处为按升序插入,若按降序改成>即可
{
p=p->next; q=q->next;
}
Lnode *newnode=new Lnode;
newnode->next=q->next;
q->next=newnode;
newnode->date=e;
}
✨6.删除元素
实现原理:找到要删除元素的前一个结点,改变该结点的指针域
//删除元素
Status ListDelete(LinkList &L,int pos)
{
Lnode *p=L;
Status i=0;
while(p->next&&i<pos-1) {p=p->next; i++;}
if(!(p->next)||i>pos-1) {cout<<"删除位置错误,删除失败!"<<endl; return ERROR;}
Lnode *q;
q=p->next;
p->next=q->next;
return OK;
}
✨7.取值
实现原理:从链表的头指针出发,逐个搜索结点的指针域,直到搜索到第i个结点为止
//取值
Status GetElem(LinkList L,int pos,ElemType &e)
{
Status j=1;
Lnode *p;
p=L->next;
while(p&&j<pos)
{
p=p->next;
j++;
}
if(!p||j>pos) return ERROR;
e=p->date;
return OK;
}
✨8.查找元素位置
//查找元素位置
Status LocateElem(LinkList L,ElemType e)
{
Status j=1;
Lnode *p;
p=L->next;
while(p&&p->date!=e)
{
p=p->next;
j++;
}
if(p) return j;
else return ERROR;
}
✨9.查找元素地址
//查找元素地址
Lnode *LocateElem2(LinkList L,ElemType e)
{
Lnode *p;
p=L->next;
while(p&&p->date!=e) //p非空且p下一个结点的数据域不等于e
p=p->next;
return p;
}
✨10.输出链表
//输出链表
void ListShow(LinkList L)
{
Lnode *p;
p=L->next;
cout<<"当前链表的元素为:";
while(p)
{
cout<<p->date<<" ";
p=p->next;
}
cout<<endl;
}
✨11.对链表元素进行排序
实现原理:现将单链表的元素放到一个数组中,对数组进行排序后,再将元素依次放入到单链表的的数据域中
//对链表元素进行排序
Status ListSortUp(LinkList &L)
{
Status i,j,t,*a,n;
n=LengthList(L);
a=new Status[n];
Lnode *p=L->next;
Lnode *q=L->next;
for(i=0;i<LengthList(L);i++)
{
a[i]=p->date;
p=p->next;
}
for(i=0;i<LengthList(L)-1;i++)
{
for(j=i+1;j<LengthList(L);j++)
{
if(a[i]>a[j]) //此处为升序排列,若按降序排列改成<即可
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<LengthList(L);i++)
{
q->date=a[i];
q=q->next;
}
cout<<"排序成功!"<<endl;
return OK;
}
✨12.清空单链表
实现原理:依次释放所有结点,并将头结点指针域置为空
//清空单链表
Status ClearList(LinkList &L)
{
Lnode *p,*q;
p=L->next;
while(p)
{
q=p->next;
delete p;
p=q;
}
L->next=NULL;
return OK;
}
✨13.销毁单链表
实现原理:从头指针开始,依次释放结点
//销毁单链表
Status DestroyList(LinkList &L)
{
Lnode *p;
while(L)
{
p=L;
L=L->next;
delete p;
}
return OK;
}
✨14.计算链表表长
实现原理:遍历单链表,p非空则i加一
//计算链表表长
Status LengthList(LinkList L)
{
Lnode *p;
Status i=0;
p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}