【数据结构】静态链表

#include <iostream>
using namespace std;

struct Node
{
	int data;
	int cur;
};

typedef Node* LinkList;
#define MAXSIZE 20
void init(LinkList List);
int getLength(LinkList List);
int malloc(LinkList List);
void free(LinkList List, int address);
//bool insert(LinkList*List, int target, int data);
bool insert(LinkList List, int target, int data);
void show(LinkList List);
bool Delete(LinkList List, int target);

int main()
{
	//LinkList List;
//	init(&List);
	Node a[MAXSIZE];
	init(a);
	cout << a[19].cur << endl;
	for (int i = 1; i <= 20; i++)
	{
		insert(a, i,i*10);
	}
	Delete(a, 19);
	show(a);
	system("pause");
	return 0;
}

//1到MAXSIZE-3赋值1至MAXSIZE-3 相当于将空闲的数组串起来
void init(LinkList List)
{
	memset(List, 0,sizeof(List));
	for (int i = 0; i < MAXSIZE - 2; i++)
	{
		List[i].cur = i+1;
	}
	List[MAXSIZE - 2].cur= 0;//这个是可用的最后一个地址,malloc这个地址后,把这个地址的cur,就是0,传给第0号元素,代表表满了!!这个超级无敌重要!!
	List[MAXSIZE - 1].cur= 0;
}

int malloc(LinkList List)
{
	int address = List[0].cur;//获得缓冲区的第一个可用空间
	if (address != 0)//如果获得了可用空间
	{
		List[0].cur = List[address].cur;
		//可用空间是用链表连接起来的,获得了一个可用空间后,就把可用空间指向的下一个可用空间赋值给0号数组
	}
	return address;
}

//删除操作就相当于把待删除的地址插入备用链表的表头
void free(LinkList List,int address)
{
	List[address].cur = List[0].cur;//将地址插入备用链表的表头
	List[0].cur = address;//0号的cur指向删除的目标地址
}

int getLength(LinkList List)
{
	int length = 0;
	int now = List[MAXSIZE - 1].cur;//首节点的地址
	while (now != 0)
	{
		length++;
		now = List[now].cur;
	}
	return length;
}

bool insert(LinkList List, int target, int data)
{
	LinkList p = List;

	if (target<1 || target>getLength(p) + 1)
	{
		cout << "insert erro:terget illegal" << endl;
		return false;
	}

	int newAddress = malloc(List);//获取地址

	if (newAddress == 0)
	{
		cout << "insert erro:memery full" << endl;
		return false;
	}

	int address = MAXSIZE - 1;
	int j = 1;
	while (j < target)
	{
		j++;
		address = p[address].cur;
	}

	p[newAddress].data = data;
	p[newAddress].cur = p[address].cur;
	p[address].cur = newAddress;

	return true;
}

void show(LinkList List)
{
	int address = List[MAXSIZE - 1].cur;
	cout << "display: ";
	while (address != 0)
	{
		cout << List[address].data << " ";
		address = List[address].cur;
	}
}

bool Delete(LinkList List, int target)
{
	if (target<1 || target>getLength(List))
	{
		cout << "delete erro:illegal address" << endl;
		return false;
	}

	int now_address = MAXSIZE - 1;
	int now_num = 1;
	while (now_num < target)
	{
		now_num++;
		now_address = List[now_address].cur;
	}
	List[now_address].cur = List[target].cur;
	free(List, target);
	return true;
}

《大话数据结构》里面,初始化部分,是错误的!最后的两位数组的cur值都应该为0!!!!

bool insert2(LinkList List, int target, int data)
{
	LinkList p = List;

	if (target<1)
	{
		cout << "insert erro:terget illegal" << endl;
		return false;
	}

	int newAddress = malloc(List);//获取地址

	if (newAddress == 0)
	{
		cout << "insert erro:memery full" << endl;
		return false;
	}

	int address = MAXSIZE - 1;
	int j = 1;
	while (j < target&&address!=0)
	{
		j++;
		address = p[address].cur;
	}
	if (address == 0)
	{
		cout << "insert erro:memery full" << endl;
		return false;
	}

	p[newAddress].data = data;
	p[newAddress].cur = p[address].cur;
	p[address].cur = newAddress;

	return true;
}

bool Delete2(LinkList List, int target)
{
	if (target<1)
	{
		cout << "delete erro:illegal address" << endl;
		return false;
	}

	int now_address = MAXSIZE - 1;
	int now_num = 1;
	while (now_num < target&&List[now_address].cur!=0)
	{
		now_num++;
		now_address = List[now_address].cur;
	}
	if (List[now_address].cur == 0)
	{
		cout << "delete erro:illegal address" << endl;
		return false;
	}
	List[now_address].cur = List[target].cur;
	free(List, target);
	return true;
}

以上是插入和删除的优化版本,主要是不需要进行计算链表长度的优化,节省了时间。一直觉得书上的方法很蠢。。

猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/81023702
今日推荐