链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。相比于数组这种连续性的储存结构,链表对于插入及删除等操作将更为方便。
准备工作
#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;
}