单链表的概念以及相关操作(C++)

本文主要介绍了单链表的概念,它是线性表的链式存储,由头结点和元素结点组成,每个结点含数据域和指针域。头结点可统一操作和判空。还阐述了单链表的相关操作,如结点定义、头插法、尾插法等,并给出了部分操作的代码。

一·单链表的概念:

单链表是线性表的一种,是将逻辑上相邻的两个元素存储到地址不连续的内存上的一种链式存储。

单链表由头结点元素结点组成。

单链表的每个结点由数据域指针域组成。数据域存储数据,指针域存储下一个结点的地址。

单链表的最后一个结点的指针域指向空(NULL)。

头结点的作用:

  1. 统一操作--由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和其他位置的结点的操作一样,无需做其他特殊处理。
  2. 统一判空--链表为空时,头结点的指针域指向空,即可判空,链表不为空时,头结点的指针域指向第一个元素结点,头结点的指针域不为空,即可判不空。

注意:如果没有头结点,以上的操作都会变得非常麻烦,读者可自行尝试。

 二·单边表的先关操作:

        2.1 结点的定义

       由于链表是由结点组成的,所以首先要做的必然是定义结点,又因为结点是由数据域和指针域组成的,所以我们自然可以将结点以结构体的形式定义。具体如下(我这里以整形数据类型为例):

typedef struct LNode {
	int date; //数据域
	struct LNode* next; //指针域 -- 指向下一个节点的地址
};

        2.2 单链表的相关操作

        包括:头插法,尾插法,在第i个节点后插入元素,删除第i个元素,计算链表长度等基本操作,具体代码如下(计算长度其实就是遍历,伴随一个计数器,其他操作会了其实这个也就会了,所以代码中我就不体现计算单链表长度了):

#include<iostream>
using namespace std;
typedef struct LNode {
	int date; //数据域
	struct LNode* next; //指针域 -- 指向下一个节点的地址
};
void printlink(LNode *head) {
	LNode* p = head->next;
	while (p != NULL)
	{
		cout << p->date << " ";
		p = p->next;
	}
	cout << endl;
}
//头插法
void headinsert() {
	LNode *L=NULL;  //接受插入元素结点指针
	LNode *head;    //头结点
	head = new LNode[sizeof(L)]; //开辟头结点内存空间
	head->next = NULL; //初始化头结点指针域
	for (int i = 0; i < 10; i++) //插入10个数字
	{
		L = new LNode[sizeof(L)]; //开辟新节点内存空间
		L->date = i; //将需要插入的元素值赋值给新节点的数据域
		L->next = head->next; //新节点指向头结点的下一个节点位置
		head->next = L;//头结点指向新节点
	}
	printlink(head); 
}

//尾插法
void tailinsert() {
	LNode* L=NULL;
	LNode* head;
	LNode* tail;
	head = new LNode[sizeof(L)];
	tail = head;
	for (int i = 0; i < 10; i++)
	{
		L = new LNode[sizeof(L)];
		L->date = i;
		tail->next = L;
		tail = L;
	}
	L->next = NULL;
	printlink(head);
}

//在第i个节点后插入新节点
void newinsert() {
	//在第五个节点后插入18
	LNode* L = NULL;
	LNode* head;
	LNode* r;
	LNode* temp = NULL;
	head = new LNode[sizeof(L)];
	head->next = NULL;
	for (int i = 0; i < 10; i++)
	{
		L = new LNode[sizeof(L)];
		L->date = i;
		L->next = head->next;
		head->next = L;
	}
	r = head->next;
	for (int i = 0; i < 4; i++)
	{
		r = r->next;
	}
	temp = new LNode[sizeof(L)];
	temp->date = 18;
	temp->next = r->next;
	r->next = temp;
	printlink(head);
}

//删除第i个节点
void deletenode() {
	//删除第5个节点
	LNode* L = NULL;
	LNode* head;
	LNode* r;
	LNode* temp;
	head = new LNode[sizeof(L)];
	head->next = NULL;
	for (int i = 0; i < 10; i++)
	{
		L = new LNode[sizeof(L)];
		L->date = i;
		L->next = head->next;
		head->next = L;
	}
	r = head->next;
	temp = head->next;
	for (int i = 0; i < 3; i++)
	{
		r = r->next;
		temp = temp->next;
	}
	temp = r->next;
	r->next = temp->next;
	free(temp);
	printlink(head);
}
int main() {
	headinsert();
	tailinsert();
	newinsert();
	deletenode();
	return 0;
}

         执行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值