0
点赞
收藏
分享

微信扫一扫

搞懂数据结构——单链表基本功能的实现


目录

🎡一、准备工作

🎡二、定义链表结构

🎡三、函数声明

🎡四、基本操作的实现

✨1.初始化链表

✨2.头插法插入元素

✨3.尾插法插入元素

✨4.按位置插入元素

✨5.按顺序插入元素

✨6.删除元素

✨7.取值

✨8.查找元素位置

✨9.查找元素地址

✨10.输出链表

✨11.对链表元素进行排序

✨12.清空单链表

✨13.销毁单链表

✨14.计算链表表长


🎡一、准备工作

还是老样子,首先介绍一下需要用到的头文件、赋值和重命名(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;
}

举报

相关推荐

0 条评论