数据结构学习,单链表

目录

预先要引用的头文件以及宏定义

所使用单链表的结构

其基本操作接口

构造一个空的单链表(带头结点)

销毁单链表

将单链表L置为空链表

单链表L为空表时返回TRUE,否则返回FALSE

求单链表的表长

查找。返回单链表L中第一个数据域值为e的结点地址,若不存在则返回NULL

返回p结点的直接后继的指针,若p结点是尾结点则返回NULL

构造元素e的结点,返回指向该结点的指针

在p结点后插入结点q

删除p结点的直接后继结点,用e返回结点值,若p空或指向尾元结点则操作失败

遍历单链表

一些接口的测试


预先要引用的头文件以及宏定义

#include<stdio.h>
#include<iostream>

using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;

所使用单链表的结构

typedef struct LNode {
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

其基本操作接口

Status InitList_L(LinkList& L);				//构造一个空的单链表
Status DestroyList_L(LinkList& L);			//销毁单链表
Status ClearList_L(LinkList& L);			//将单链表L置为空链表
Status ListEmpty_L(LinkList L);				//单链表L为空表时返回TRUE,否则返回FALSE
int ListLength_L(LinkList L);				//求单链表的表长
LNode* Search_L(LinkList L, ElemType e);	//查找。返回单链表L中第一个数据域值为e的结点地址,若不存在则返回NULL
LNode* NextElem_L(LNode* p);				//返回p结点的直接后继的指针,若p结点是尾结点则返回NULL
LNode* MakeNode_L(ElemType e);				//构造元素e的结点,返回指向该结点的指针
Status InsertAfter_L(LNode* p, LNode* q);	//在p结点后插入结点q
Status DeleteAfter_L(LNode* p, ElemType e);	//删除p结点的直接后继结点,用e返回结点值,若p空或指向尾元结点则操作失败
void ListTraverse_L(LinkList L);			//遍历单链表

构造一个空的单链表(带头结点)

Status InitList_L(LinkList& L)
{
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL)
	{
		return OVERFLOW;
	}
	else
	{
		L->next = NULL;
		return OK;
	}
}

销毁单链表

Status DestroyList_L(LinkList& L)
{
	if (L != NULL)
	{
		LNode* p, * q;
		p = L->next;
		free(L);
		while (p != NULL)
		{
			q = p;
			p = p->next;
			free(q);
		}
		return OK;
	}
	else
	{
		return OVERFLOW;
	}
}

将单链表L置为空链表

Status ClearList_L(LinkList& L)
{
	if (L != NULL)
	{
		LNode* p, * q;
		p = L->next;
		while (p != NULL)
		{
			q = p;
			p = p->next;
			free(q);
		}
		L->next = NULL;
		return OK;
	}
	else
	{
		return OVERFLOW;
	}
}

单链表L为空表时返回TRUE,否则返回FALSE

Status ListEmpty_L(LinkList L)
{
	if (L != NULL)
	{
		if (L->next == NULL)
		{
			return TRUE;
		}
		else
		{
			return ERROR;
		}
	}
	else
	{
		return OVERFLOW;
	}
}

求单链表的表长

int ListLength_L(LinkList L)
{
	if (L != NULL)
	{
		LNode* p, * q;
		p = L->next;
		int sum = 0;
		while (p != NULL)
		{
			sum++;
			p = p->next;
		}
		return sum;
	}
	else
	{
		return OVERFLOW;
	}
}

查找。返回单链表L中第一个数据域值为e的结点地址,若不存在则返回NULL

LNode* Search_L(LinkList L, ElemType e)
{
	LNode* p;
	if (L == NULL)
	{
		return NULL;
	}
	else
	{
		p = L->next;
		while (p != NULL && p->data != e)
		{
			p = p->next;
		}
		return p;
	}
}

返回p结点的直接后继的指针,若p结点是尾结点则返回NULL

LNode* NextElem_L(LNode* p)
{
	if (p == NULL)
	{
		return NULL;
	}
	else
	{
		return p->next;
	}
}

构造元素e的结点,返回指向该结点的指针

LNode* MakeNode_L(ElemType e)
{
	LNode* p;
	p = (LNode*)malloc(sizeof(LNode));
	if (p != NULL)
	{
		p->data = e;
		p->next = NULL;
	}
	return p;	
}

在p结点后插入结点q

Status InsertAfter_L(LNode* p, LNode* q)
{
	if (p == NULL || q == NULL)
	{
		return ERROR;
	}
	else
	{
		q->next = p->next;
		p->next = q;
		return OK;
	}
}

删除p结点的直接后继结点,用e返回结点值,若p空或指向尾元结点则操作失败

Status DeleteAfter_L(LNode* p, ElemType e)
{
	if (p == NULL || p->next == NULL)
	{
		return ERROR;
	}
	else
	{
		LNode* q;
		q = p->next;
		p->next = q->next;
		e = q->data;
		free(q);
		return OK;
	}
}

遍历单链表

void ListTraverse_L(LinkList L)
{
	if (L != NULL)
	{
		LNode* p, * q;
		p = L->next;
		while (p != NULL)
		{
			cout << p->data;
			p = p->next;
		}
	}
}

一些接口的测试

int main()
{
	//单链表
	LinkList L;
	InitList_L(L);
	cout << ListEmpty_L(L) << endl;
	LNode* p = L;
	for (int i = 0; i < 4; i++)
	{
		LNode* q;
		q = MakeNode_L(i);
		InsertAfter_L(p, q);
		p = q;
	}
	cout << ListEmpty_L(L) << endl;
	cout << ListLength_L(L) << endl;
	ListTraverse_L(L);
	cout << "\n";
	DeleteAfter_L(L, 2);
	ListTraverse_L(L);
	ClearList_L(L);
	DestroyList_L(L);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉更爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值