0
点赞
收藏
分享

微信扫一扫

单链表及其基本操作

全栈学习笔记 2022-02-20 阅读 66

链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。相比于数组这种连续性的储存结构,链表对于插入及删除等操作将更为方便。

准备工作

#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
using namespace std;
struct student
{
	int score;
	struct student* next;
};
typedef struct student stu;//方便点儿

链表的创建

单链表分为带头结点的链表和不带头结点的链表,二者的区别是带头结点的链表是 从第二个点即head->next 开始存储数据,不带头结点的链表从head就开始存储数据,带头结点的链表方便操作

创建不带头结点的链表

stu* make_link(stu* head)//创建不带头结点链表
{
	stu* tail=NULL;
	for (int i = 1; i <= 10; i++)//顺便赋个值
	{
		stu* pnew = (stu*)malloc(sizeof(stu));
		pnew->score = i;
		pnew->next = NULL;//下一个位置还没有定
		if (head == NULL)
        {
			head = pnew;
			tail = head;
		}
		else {
			tail->next = pnew;
			tail = pnew;//此时tail->next已经有了指向
		}
	}
	return head;
}
void print_link(stu* head)//输出不带头结点链表
{
	while (head != NULL)
	{
		cout << head->score << endl;
		head = head->next;
	}
}

创建带头结点的链表

stu* Tmake_link(stu* head)//创建带头结点的链表
{
	head = (stu*)malloc(sizeof(stu));
	head->next = NULL;
	stu* tail = head;
	for (int i = 1; i <= 10; i++)
	{
		stu* pnew = (stu*)malloc(sizeof(stu));
		pnew->score = i;
		pnew->next = NULL;//新节点指向NULL
		tail->next = pnew;//尾结点指针指向新节点
		tail = pnew;//新节点变尾结点
	}
	return head;
}
void Tprint_link(stu* head)//输出带头结点链表
{
	head = head->next;//带头结点链表头结点不存储数据
	while (head != NULL)
	{
		cout << head->score << endl;
		head = head->next;
	}
}

链表基本操作

个人还是喜欢用带头结点的链表的 以下操作均为对带头结点链表的操作

寻找第K个结点的值

int Find_Kth(int k, stu* list)//寻找第K个结点的值
{
	int i = 0;
	while (list != NULL && i < k)
	{
		list = list->next;
		i++;
	}
	if (i == k)
		return list->score;
	else
		return NULL;
}

获得链表长度

int Get_link_length(stu* list)//获得链表长度
{
	int i = 0;
	list = list->next;
	while (list != NULL)
	{
		i++;
		list = list->next;
	}
	return i;
}

寻找出现值的第一个结点

int Find_first(int k, stu* list)//寻找出现值的第一个结点
{
	int i = 0;
	list = list->next;//带头结点
	for (i = 1; i <= 10; i++)
	{
		if (list->score == k)
			return i;
		else
			list = list->next;
	}
	return -1;
}

在第l个结点前加入K

void Insert(int k, int l, stu* list)//在第l个结点前加入K
{
	stu* p = (stu*)malloc(sizeof(stu));
	p->score = k;
	for (int i = 0; i < l - 1; i++)
	{
		list = list->next;
	}
	p->next = list->next;
	list->next = p;
}

删除第K个结点

void Delite_list(stu* list, int k)//删除第k个结点
{
	for (int i = 1; i < k; i++)
	{
		list = list->next;
	}
	list->next = list->next->next;
}
举报

相关推荐

0 条评论