静态链表的插入和删除(六)

静态链表的插入和删除

静态链表相当于是用一个数组来实现线性表的链式存储结构,在静态链表中操作的是数组。

一、静态链表的插入操作
静态链表的插入操作包含两部分,首先是获得空闲量的下标,程序代码如下;

int getCur(StaticLinkList tan)
{
	int i = tan[0].cur;
	if(tan[0].cur)tan[0].cur = tan[i].cur;

	return i;
}

要想更好的理解,最好结合一个静态列表的实例来掌握,下面给出一静态列表


每当进行插入时,便可以从备用链表上取得第一结点下作为待插入的新结点,下面给出在静态链表中第i个元素之前插入新的数据e的代码。

int ListInsert(StaticLinkList tan,int i,ElemType e)//静态链表中第i个元素之前插入新的数据e
{
	int l,j,k;

	k = MAXSIZE -1;//数组最后一个元素的下标
	if(i < 1|| i > ListLength(L)+ 1)//ListLength为计算链表长度的函数
		return error;

	j = getCur(tan);

	if(j)
	{
		tan[j].data = e;
		for(l = 1;l <= i - 1;l++)
		{
			k = tan[k].cur;
		}

		tan[j].cur = tan[k].cur;
		tan[k].cur = j;

		return bingo;
	}

	return  error;
}

二、静态链表的删除操作

为了很好的表示静态链表的删除操作,下面给出一静态链表的实例。


假设删除静态链表中下标为2的元素,即为链表中第3个元素

void recycleNode(StaticLinkList tan,int i)//将下标为k的空闲结点回收到备用链表
{
	tan[i].cur = tan[0].cur ;
	tan[0].cur  = i;
}
int ListDelete(StaticLinkList tan,int i)//删除链表中第i个数据元素
{
	int j,k;
	if(i < 1 || i > ListLength(L))return error;

	k = MAXSIZE - 1;

	for(j = 1;j <= i -1;j++)
	{
		k = tan[k].cur;//得到删除元素前一个元素的下标

	}
	j = tan[k].cur;//将要删除元素的下标
	tan[k].cur = tan[j].cur;

	recycleNode(tan,j);

	return bingo;
}

总结下静态链表的优缺点:

优点:在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要大量移动元素的缺点。

缺点:1)失去了顺序存储结构随机存取的特性。2)没有解决连续存储分配(数组)带来的表长难以确定的问题。









静态链表是一种使用数组来实现的链表。在静态链表中,每个节点都包含一个数据元素和一个指向下一个节点的索引。 静态链表插入操作分为两步: 1. 需要找到插入位置的前一个节点。 2. 在数组中找到一个空闲位置,将新节点插入,并更新前一个节点的指针。 静态链表删除操作也分为两步: 1. 需要找到要删除节点的前一个节点。 2. 将要删除节点的索引释放,并更新前一个节点的指针。 以下是示例代码实现静态链表插入删除操作: ```cpp #include <iostream> const int MAX_SIZE = 100; // 最大容量 struct Node { int data; int next; }; class StaticLinkedList { public: StaticLinkedList() { for (int i = 0; i < MAX_SIZE; i++) { nodes[i].next = -1; // 初始化所有节点的next为-1,表示空节点 } head = -1; // 初始化头节点 } // 插入操作 void insert(int value) { int newNodeIndex = getFreeNodeIndex(); if (newNodeIndex == -1) { std::cout << "链表已满,无法插入新节点" << std::endl; return; } nodes[newNodeIndex].data = value; if (head == -1) { head = newNodeIndex; } else { int current = head; while (nodes[current].next != -1) { current = nodes[current].next; } nodes[current].next = newNodeIndex; } } // 删除操作 void remove(int value) { if (head == -1) { std::cout << "链表为空,无法删除节点" << std::endl; return; } int prev = -1; int current = head; while (current != -1 && nodes[current].data != value) { prev = current; current = nodes[current].next; } if (current == -1) { std::cout << "未找到要删除的节点" << std::endl; return; } if (prev == -1) { head = nodes[current].next; } else { nodes[prev].next = nodes[current].next; } releaseNodeIndex(current); } // 打印链表 void print() { int current = head; while (current != -1) { std::cout << nodes[current].data << " "; current = nodes[current].next; } std::cout << std::endl; } private: Node nodes[MAX_SIZE]; int head; // 获取空闲的节点索引 int getFreeNodeIndex() { for (int i = 0; i < MAX_SIZE; i++) { if (nodes[i].next == -1) { return i; } } return -1; // 没有空闲节点 } // 释放节点索引 void releaseNodeIndex(int index) { nodes[index].next = -1; } }; int main() { StaticLinkedList list; list.insert(1); list.insert(2); list.insert(3); list.print(); // 输出:1 2 3 list.remove(2); list.print(); // 输出:1 3 return 0; } ``` 这是一个简单的静态链表实现,你可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值