王道数据结构C语言单链表基本操作实现

一、头插

头插流程示意图:注意是先连后断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//单链表定义
//链表结点
typedef struct {//定义单链表结点类型
	int data;//数据域
	struct LNode *next;//指针域
}LNode, *LinkList;

void MyPrint(LinkList L) {
	LNode* i = L->next;//用i指针遍历整个链表
	while (i != NULL) {
		printf("%d ", i->data);
		i = i->next;
	}
}


//头插法建立单链表
LinkList list_HeadInsert(LinkList* L) {
//为了能影响到原先的链表,我们这里是用LinkList*
//LinkList本身是一个指针,LinkList*是指针的指针,它指向存放头指针的地址
	LNode* s ;//新插入的结点
	int x;//结点值
	*L = (LinkList)malloc(sizeof(LNode));//创建头结点
	//L是指向原先头指针的地址,对它解引用(*L)就是原先的头指针
	(*L)->next = NULL;//初始为空链表
	scanf("%d", &x);//输入结点的值
	while (x != 9999) {
		LNode* s = (LNode*)malloc(sizeof(LNode));//创建新结点
		s->data = x;
		s->next = (*L)->next;
		(*L)->next = s;
		scanf("%d", &x);//输入新结点的值
	}
	return L;
}

int main() {
	LinkList L = NULL;
	list_HeadInsert(&L);
	MyPrint(L);
	return 0;
}

测试用例如下
在这里插入图片描述

注意,因为头插法是先插的排后面去了,所以头插法生成的数是逆序

二、尾插

尾插流程示意图:注意是先连后断
这里我们设置一个指向链表尾部的指针rear
(不设尾指针的话,你要尾插每次都要从前往后找,比较麻烦)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//尾插法建立单链表
LinkList List_TailInsert(LinkList* L) {
	LNode*s;//新插入结点
	int x;//结点值
	*L = (LinkList)malloc(sizeof(LNode));
	(*L)->next = NULL;
	LNode* rear = *L;
	//尾结点指针rear,这里赋值时注意对L解引用,L是指向头结点的指针,解引用才是头结点
	scanf("%d", &x);
	while (x != 9999) {//输入9999视为结束标志
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = NULL;
		rear->next = s;
		rear = s;
		scanf("%d", &x);
	}
	return L;
}

int main() {
	LinkList L = NULL;
	List_TailInsert(&L);
	MyPrint(L);
	return 0;
}

在这里插入图片描述

三、查找

3.1按序号插

//按序号查找——这里是按位序,位序从1开始
LNode* GetElem(LinkList* L, int i) {
	if (i < 1) {
		return NULL;
	}
	LNode*s=(*L)->next;//用s来遍历链表
	for (int j = 1;j < i&&s!=NULL;j++) {
		s = s->next;
	}
	return s;
}

int main() {
	LinkList L = NULL;
	printf("请插入链表元素,以9999为结束标志:");
	List_TailInsert(&L);
	MyPrint(L);
	printf("\n");

	printf("请输入要查的链表元素位序:");
	int i = 0;
	scanf("%d", &i);
	printf("指定位序结点值为:%d", GetElem(&L, i)->data);
	return 0;
}

在这里插入图片描述

3.2按值查

LNode* LocateElem(LinkList* L, int i) {
	LNode* s = (*L)->next;
	while (s != NULL) {
		if (s->data == i) {//找到就返回,不用继续找了
			return s;
		}
		s = s->next;
	}
	return NULL;//上面while走完都没返回,则返回NULL
}

int main() {
	LinkList L = NULL;
	printf("请插入链表元素,以9999为结束标志:");
	List_TailInsert(&L);
	MyPrint(L);
	printf("\n");

	printf("请输入要查的链表元素值:");
	int i = 0;
	scanf("%d", &i);
	if (LocateElem(&L, i)!=NULL) {
		printf("指定结点值为:%d", LocateElem(&L, i)->data);
	}
	else {
		printf("链表中无该值的结点");
	}
	return 0;
}

查找成功用例:
在这里插入图片描述
查找失败用例:
在这里插入图片描述

四、任意位置插入

将值为x的结点插到单链表第i个位置
其实就是找到第i-1个位置,在它后面进行一个插入
在这里插入图片描述

p=GetElem(&L,i-1);//找到第i-1位置的结点
s->next=p->next;//先连
p->next=s;//后断

五、删除结点

要删掉链表第i个位置元素
在这里插入图片描述

也是先找到第i-1个位置元素,直接把第i-1个元素连上要删元素的下一个
再把要删元素free掉即可

p=GetElem(L,i-1);
q=p->next;
p->next=q->next;
free(q);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值