数据结构之静态单链表

静态链表L存储
游标 cur5234067....1
数据 data ACDE  ..... 
下标0123456.....999

L[0].cur放置空闲链表的第一个节点下标

L[MAXSIZE-1].cur放置第一个元素开始位置的下标

//静态链表结构
typedef struct  {
	int data;
	int cur;//游标
}Component, staticLinkList[MAXSIZE];
在元素C之前插入元素B之后
游标 cur6534027....1
数据 data ACDEB ..... 
下标0123456.....999
void ListInsert(staticLinkList L, int i, int e) {
	int j, k, l;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置错误!" << endl;
	}
	j = Malloc_SLL(L);//获取链表后的第一个空位置下标
	if (j) {//准备插入操作
		L[j].data = e;
		for (l = 1; l <= i - 1; l++) {
			k = L[k].cur;
		}//循环直到找到第i个元素的前一个元素

		L[j].cur = L[k].cur;//例如在C之前插入B,则遍历到A,把A的cur赋值给B的cur
		L[k].cur = j;//把B的下标赋值给A的cur
	}
}
删除第3个元素C之后
游标 cur2564027....1
数据 data A DEB ..... 
下标0123456.....999
void ListDelete(staticLinkList L, int i) {
	int j, k;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置错误!" << endl;
	}
	for (j = 1; j <= i - 1; j++) {
		k = L[k].cur;//例如删除第3个元素,循环2次,k=1,k=5
	}
	j = L[k].cur;//j=2
	L[k].cur = L[j].cur;
	Free_SLL(L, j);

}
void Free_SLL(staticLinkList L, int k) {
	L[k].cur = L[0].cur;
	L[0].cur = k;

}

----------------------总结-----------------------

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

缺点:没有解决连续存储分配带来的表长难以确定的问题

 

总体源码:

#include<iostream>
#define MAXSIZE 1000
using namespace std;
typedef struct  {
	int data;
	int cur;//游标
}Component, staticLinkList[MAXSIZE];
void InitList(staticLinkList space);//初始化
int Malloc_SLL(staticLinkList space);//获取空闲分量的下标
void Free_SLL(staticLinkList L,int k);
void ListInsert(staticLinkList L,int i,int e);//在第i个位置前插入元素e
void ListDelete(staticLinkList L, int i);//删除链表第i个元素
void traversal(staticLinkList L);
int ListLength(staticLinkList L);
int main() {
	staticLinkList L;
	InitList(L);
	for (int i = 1; i <= 4; i++) {
		ListInsert(L, i, i*2);
	}
	traversal(L);
	cout << "该静态链表的长度为:" << ListLength(L) << endl;
	ListDelete(L, 2);
	cout << "----------删除第2个元素之后-------" << endl;
	traversal(L);
	cout << "该静态链表的长度为:" << ListLength(L) << endl;
	return 0;
}
void InitList(staticLinkList space) {
	for (int i = 0; i < MAXSIZE - 1; i++) {
		space[i].cur = i + 1;
	}
	space[MAXSIZE - 1].cur = 0;
}
int Malloc_SLL(staticLinkList space) {
	int i = space[0].cur;
	if (space[0].cur) {
		space[0].cur=space[i].cur;
	}
	return i;
}
void ListInsert(staticLinkList L, int i, int e) {
	int j, k, l;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置错误!" << endl;
	}
	j = Malloc_SLL(L);//获取链表后的第一个空位置下标
	if (j) {//准备插入操作
		L[j].data = e;
		for (l = 1; l <= i - 1; l++) {
			k = L[k].cur;
		}//循环直到找到第i个元素的前一个元素

		L[j].cur = L[k].cur;//例如在C之前插入B,则遍历到A,把A的cur赋值给B的cur
		L[k].cur = j;//把B的下标赋值给A的cur
	}
}
int ListLength(staticLinkList L) {
	int k = L[MAXSIZE - 1].cur;
	int m = 0;
	while (k!=0) {
		k = L[k].cur;
		++m;
	}
	return m;
}
void traversal(staticLinkList L) {
	int k = L[MAXSIZE - 1].cur;
	int e;
	cout << "该静态链表遍历得:";
	while (k != 0) {
		e = L[k].data;
		cout << e << "   ";
		k = L[k].cur;
	}
	cout << endl;
}
void ListDelete(staticLinkList L, int i) {
	int j, k;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置错误!" << endl;
	}
	for (j = 1; j <= i - 1; j++) {
		k = L[k].cur;//例如删除第3个元素,循环2次,k=1,k=5
	}
	j = L[k].cur;//j=2
	L[k].cur = L[j].cur;
	Free_SLL(L, j);

}
void Free_SLL(staticLinkList L, int k) {
	L[k].cur = L[0].cur;
	L[0].cur = k;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值