数据结构——链表(适合初学者)
第一次写博客,由于本人水平有限,文章中若有什么错误或需要修改的地方,欢迎大家指正!
本篇主要是讲数据结构中的链表,用c语言实现,知识比较基础,本人也是现学现卖,与大家交流一下学习经验。
首先定义链表结构体:
//定义数据结构
typedef struct _Node {
int number;
struct _Node* Next;
}Node;
//为了使AddlinK()函数更好用,定义以下结构体;
typedef struct _List {
Node* head;
Node* tail;
int longs;
}List;
操作的函数:
void Initlink(List* pList);//初始化链表
void Addlink(int number, List* pList);//在链表中加入数值
void Showlink(List* pList);//显示全部元素
void AllDelete(List* pList);//删除全部元素
void Insertlink(List* pList, int number, int a);//在特定的位置加特定的元素
void Deletelink(List* pList, int i);//删除特定的元素
void Searchlink(List* pList, int i);//查找第i个元素
主函数:
主函数主要用于验证操作函数
//主函数
//需要实现把数据(number)存在数据链表中
#include <stdlib.h>
#include <stdio.h>
int main() {
int number;
List list;
Initlink(&list);
//链表中加入元素
for (int i = 10; i >= 0; i--) {
Addlink(i, &list);
}
Showlink(&list);
Insertlink(&list, 10, 3);
Showlink(&list);
Deletelink(&list, 4);
Searchlink(&list, 5);
//AllDelete(&list);
Showlink(&list);
return 0;
}
初始化链表:
三个参数:
1.头指针
2.末尾指针
3.链表长度
//初始化链表
void Initlink(List* pList) {
printf("-------------------------------------------------------\n");
pList->head = NULL;
pList->tail = NULL;
pList->longs = 0;
}
操作函数——>在末尾加数值
//在最后面插入元素
void Addlink(int number,List* pList) {
//printf("-------------------------------------------------------\n");
Node* p = (Node*)malloc(sizeof(Node));
p->Next = NULL;
p->number = number;
if (pList->tail) {
pList->tail->Next = p;
pList->tail = p;
}
else {
pList->head = p;
pList->tail = p;
}
pList->longs++;
}
显示链表所有的元素
//显示链表所有元素
void Showlink(List* pList) {
printf("-------------------------------------------------------\n");
if (pList->head) {
int n = 1;
Node* p = pList->head;
while (p) {
printf("The No%d number is %d\n", n, p->number);
p = p->Next;
n++;
}
printf("链表的长度是:%d\n", pList->longs);
}
else
printf("This link is NULL !\n");
}
运行结果:
删除链表
void AllDelete(List *pList) {
printf("-------------------------------------------------------\n");
if (pList->head) {
Node* p;
Node* q;
for (p = pList->head;p;p=q) {
if (p->Next) {
q = p->Next;
free(p);
}
else
free(p); break;
}
pList->head = NULL;
pList->tail = NULL;
printf("删除链表所有元素成功!\n");
}
else return 0;
}
实现在链表中某个特定的位置插入特定的元素
//实现在链表中某个特定的位置插入特定的元素
void Insertlink(List* pList,int number,int a) {
printf("-------------------------------------------------------\n");
if (a > pList->longs || a==pList->longs || a<=0) {
printf("警告:错误操作!!!\n");
return 0;
}
else {
Node* p = (Node*)malloc(sizeof(Node));
p->number = number;
p->Next = NULL;
Node* q = pList->head;
Node* r = q->Next;
for (int n = 1; n < a; n++) {
q = r;
r = q->Next;
}
q->Next = p;
p->Next = r;
pList->longs++;
}
}
运行结果:
删除第i个元素,并输出该元素的值
//删除第几位元素,并输出删除元素的值
void Deletelink(List* pList, int i) {
printf("-------------------------------------------------------\n");
if (i > pList->longs || i < 1) {
printf("警告:错误操作!!!\n");
return 0;
}
else if (i == pList->longs) {
Node* p = pList->head;
while (p->Next) {
p = p->Next;
}
printf("删除元素的值是:%d\n", p->number);
free(p);
pList->longs--;
}
else if (i == 1) {
Node* p;
p = pList->head->Next;
free(pList->head);
pList->head = p;
pList->longs--;
}
else {
Node* p = pList->head;
Node* q = p->Next;
for (int a = 2; a < i; a++) {
p = q;
q = p->Next;
}
p->Next = p->Next->Next;
printf("删除元素的值是:%d\n", q->number);
free(q);
pList->longs--;
}
}
运行结果:
查找第i个值
//查找第i个值
void Searchlink(List* pList, int i) {
printf("-------------------------------------------------------\n");
if (i > pList->longs || i < 1) {
printf("超出链表范围!!!\n");
}
else {
Node* p = pList->head;
for (int n = 1; n < i; n++) {
p = p->Next;
}
printf("第%d个元素的值是:%d\n", i, p->number);
}
}
运行结果: