数据结构:链表的基本操作实现

本文实现的是带头结点的链表

目录

一、链表的定义

二、基本操作实现

三、测试代码

四、测试结果

一、链表的定义

typedef struct node {
	ElemType data;
	struct node* next;
}LNode, *LinkList;

二、基本操作实现

#define DataType int

typedef struct node {
	DataType data;
	struct node* next;
}LNodeList, *LinkList;



//创建单链表
LinkList Creat_LinkList() {
	LinkList L = (LinkList)malloc(sizeof(LNodeList));
	if (L) {
		L->next = NULL;
		printf("创建成功\n");
	}
	else {
		printf("创建失败\n");
	}
	return L;
}

//销毁单链表
void Destory_LinkList(LinkList* L) {
	LinkList p, q;
	p = *L;
	while (p) {
		q = p;
		p = p->next;
		free(q);
		q = NULL;
	}
	*L = NULL;
	printf("销毁成功\n");
}

//求表长
int Length_LinkList(LinkList L) {
	LinkList p = L->next;
	int i = 0;
	if (!L)
		return 0;
	while (p) {
		i++;
	}
	return i;
}

//按位查找
LinkList Locate_LinkList_Pos(LinkList L, int i) {
	LinkList p = L;
	int j = 0;
	for (j = 0; j < i; j++) {
		p = p->next;
	}
	return p;
}

//按值查找
LinkList Locate_LinkList_Value(LinkList L, DataType x) {
	LinkList p = L->next;
	while (p) {
		if (p->data == x)
			return p;
		p = p->next;
	}
	return NULL;
}

//插入操作:在第i个位置插入值为x的元素
int Insert_LinkList(LinkList L, int i, DataType x) {
	LinkList tmp, q, p = L;
	q = (LinkList)malloc(sizeof(LNodeList));
	if (!q) {
		return 0;   //插入失败
	}
	q->data = x;
	int j = 0;
	//找到第i-1个元素的指针
	for (j = 1; j < i; j++) {
		p = p->next;
	}
	tmp = p->next;
	p->next = q;
	q->next = tmp;
	return 1;  //插入成功
}

//删除操作:删除第i个元素
int Del_LinkList(LinkList L, int i) {
	int j = 0;
	LinkList tmp, p = L;
	//找到第i-1个结点的位置
	for (j = 1; j < i; j++) {
		p = p->next;
	}
	tmp = p->next;
	p->next = tmp->next;
	free(tmp);
	tmp = NULL;
	return 1;  //删除成功
}

//输出链表所有结点的值
void Show_LinkList(LinkList L) {
	LinkList p = L->next;
	while (p) {
		printf("%d  ", p->data);
		p = p->next;
	}
}

三、测试代码

int main() {
	LinkList L = Creat_LinkList();
	for (int i = 0; i < 10; i++) {
		if (Insert_LinkList(L, i + 1, i + 1))
			printf("插入 %d 成功\n", i + 1);
	}
	printf("\n链表元素:\n");
	Show_LinkList(L);
	printf("\n");
	printf("第5个元素的值为:%d\n", (Locate_LinkList_Pos(L, 5))->data);
	printf("\n");
	printf("第5个元素的值为:%d\n", (Locate_LinkList_Value(L, 5))->data);
	printf("\n");
	if (Del_LinkList(L, 5))
		printf("删除成功\n");
	printf("\n");
	printf("\n链表元素:\n");
	Show_LinkList(L);
	printf("\n");
	Destory_LinkList(&L);

	return 0;
}

四、测试结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态链表是一种使用数组实现链表结构。它通过数组中的元素自身的指针来实现链表的连接关系。以下是静态链表基本操作: 1. 初始化:创建一个包含足够多元素的数组,每个元素包含两个字段,一个用于存储数据,另一个用于存储指向下一个元素的索引。初始化时,设置数组中所有元素的指针字段为-1,表示链表为空。 2. 插入:插入操作将新元素插入到静态链表中的指定位置。首先找到一个空闲位置并将新元素插入其中,然后将前一个元素的指针字段指向新元素,在将新元素的指针字段指向原来位置的后继元素。 3. 删除:删除操作将静态链表中指定位置的元素移除。首先将要删除的元素的前一个元素的指针字段指向要删除元素的后继元素,然后将要删除元素所在位置设置为空闲。 4. 查找:查找操作可以根据给定的关键字或索引在静态链表中找到对应的元素。可以通过遍历整个链表,逐个比较每个节点中存储的值与给定关键字或索引进行匹配。 5. 更新:更新操作用于修改静态链表中指定位置元素的值。首先找到要更新的元素位置,然后将其值进行修改。 需要注意的是,静态链表的插入和删除操作可能需要额外的空间来存储空闲位置的索引信息,以便快速找到可用位置。另外,由于静态链表使用数组实现,插入和删除操作可能会涉及元素的移动,因此效率较低,适用于对数据的频繁查找而不是插入和删除的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值