数据结构——链表(适合初学者)

数据结构——链表(适合初学者)

第一次写博客,由于本人水平有限,文章中若有什么错误或需要修改的地方,欢迎大家指正!
本篇主要是讲数据结构中的链表,用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);
	}
}

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值