单链表基本操作

本文介绍了一种单链表的数据结构,并提供了详细的C++实现代码。文章讲解了链表的基本概念及其核心操作,包括初始化、添加、删除、查找等,并实现了逆序和排序功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近正好在复习数据结构,链表作为比较重要的数据结构,特地自己实现了一遍。

首先我们要理解几个概念:

1、链式存储是最常用的存储方式之一,可以表示线性和非线性的数据结构。

2、按照链式存储的线性表简称为链表。

3、单链表是一种链式存取的数据结构,用一组地址任意的存储单元来存放线性表中的数据元素。

4、链表由节点构成,每个节点的构成为:元素+指针(指向后继元素)


理解这几个基本的概念之后,考虑如何链表的功能:1、初始化链表2、创建链表3、添加元素(往头部添加、往尾部添加、中间添加)4、删除元素(头删除、尾删除、中间删除)5、查找节点6、查找元素7、修改节点元素8、清空链表9、链表大小10、逆序链表

除此之外,在具体实现上为了方便起见,我们可以为链表设置一个头节点。

#include<iostream> 
#include<assert.h>
using namespace std;

#define ElemType int
typedef struct ListNode
{
	ElemType data;
	ListNode *next;
}ListNode, *PNode;

typedef struct List
{
	ListNode *first; //PNode  first
	ListNode *last;  //PNode  last
	size_t    size;
}List;

void InitList(List *list);
bool push_back(List *list, ElemType x);
bool push_front(List *list, ElemType x);
void ShowList(List *list);
void pop_back(List *list);
bool insert_val(List *list, ElemType x);
bool delete_val(List *list, ElemType key);
ListNode* find_key(List *list, ElemType key);
void clear_list(List *list);
void destroy_list(List *list);
void reverse_list(List *list);
void sort_list(List *list);

void InitList(List *list)
{
	list->first = list->last = (ListNode*)malloc(sizeof(ListNode));
	list->last->next = NULL;
	assert(list->first != NULL);
	list->size = 0;
}

bool push_back(List *list, ElemType x)
{
	ListNode *s = (ListNode*)malloc(sizeof(ListNode));
	if(s == NULL)
		return false;
	s->data = x;
	s->next = NULL;

	list->last->next = s;
	list->last = s;
	list->size++;

	return true;
}

bool push_front(List *list, ElemType x)
{
	ListNode *s = (ListNode*)malloc(sizeof(ListNode));
	if(s == NULL)
		return false;
	s->data = x;
	s->next = list->first->next;
	list->first->next = s;
	if(list->size == 0)
		list->last = s;
	list->size++;
	return true;
}

void ShowList(List *list)
{
	ListNode *p = list->first->next;
	while(p != NULL)
	{
		cout<<p->data<<"-->";
		p = p->next;
	}
	cout<<"Over."<<endl;
}

void pop_back(List *list)
{
	if(list->size == 0)
		return;
	ListNode *p = list->first;
	while(p->next != list->last)
		p = p->next;
	p->next = NULL;
	free(list->last);
	list->last = p;
	list->size--;
}

bool insert_val(List *list, ElemType x)
{
	ListNode *p = list->first;
	while(p->next!=NULL && x>p->next->data)
		 p = p->next;

	ListNode *s = (ListNode*)malloc(sizeof(ListNode));
	if(s == NULL)
		return false;
	s->data = x;
	s->next = NULL;

	s->next = p->next;
	p->next = s;

	if(p == list->last)
		list->last = s;

	list->size++;
	return true;
}

bool delete_val(List *list, ElemType key)
{
	if(list->size == 0)
		return false;
	ListNode *p = list->first;
	while(p->next!=NULL && p->next->data!=key)
		p = p->next;
	if(p->next == NULL)
		return false;
	ListNode *q = p->next;
	p->next = q->next;
	if(q == list->last)
		list->last = p;
	free(q);
	list->size--;
	return true;
}

ListNode* find_key(List *list, ElemType key)
{
	if(list->size == 0)
		return false;
	ListNode *p = list->first->next;
	while(p!= NULL && p->data!=key)
		p = p->next;
	return p;
}

void clear_list(List *list)
{
	if(list->size == 0)
		return;
	ListNode *p = list->first->next;
	while(p != NULL)
	{
		list->first->next = p->next;
		free(p);
		p = list->first->next;
	}
	list->last = list->first;
	list->size = 0;
}

void destroy_list(List *list)
{
	clear_list(list);
	free(list->first);
	list->first = list->last = NULL;
}

void reverse_list(List *list)
{
	if(list->size <= 1)
		return;
	ListNode *p = list->first->next;
	ListNode *q = p->next;
	list->last = p;
	list->last->next = NULL;
	while(q != NULL)
	{
		p = q;
		q = p->next;
		p->next = list->first->next;
		list->first->next = p;
	}
}

void sort_list(List *list)
{
	if(list->size <= 1)
		return;

	ListNode *p = list->first->next;
	ListNode *q = p->next;
	list->last = p;
	list->last->next = NULL;

	ListNode *t;
	while(q != NULL)
	{
		p = q;
		q = q->next;

		t = list->first;
		while(t->next!=NULL && p->data>t->next->data)
			t = t->next;

		if(t->next == NULL)
			list->last = p;

		p->next = t->next;
		t->next = p;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值