#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;
}
以上是插入和删除的优化版本,主要是不需要进行计算链表长度的优化,节省了时间。一直觉得书上的方法很蠢。。