/**
*2018-8-23 21:35
*静态链表的实现
*数组中第一个结点表示备用链表的第一个结点
*数组中最后一个结点表示链表的第一个结点
*当next域为0时均代表到了当前链表的结尾,因此有两个数组单元(0与MAX-1)无法存储目标数据
*
*/
#include<stdio.h>
#define MAX 10 //此时静态链表中只能存储8个元素
typedef struct {
int next;
char e;
}elem;
typedef struct {
elem data[MAX];
int length;
}staticLinked;
staticLinked create();
void insert(staticLinked *linked, char e);
void delete(staticLinked *linked, char e);
int location(staticLinked *linked, char e);
int main() {
staticLinked linkedList = create();
insert(&linkedList, 'A');
insert(&linkedList, 'B');
insert(&linkedList, 'B');
insert(&linkedList, 'C');
insert(&linkedList, 'D');
insert(&linkedList, 'D');
insert(&linkedList, 'E');
insert(&linkedList, 'E');
insert(&linkedList, 'F');
insert(&linkedList, 'F');
insert(&linkedList, 'F');
insert(&linkedList, 'F');
delete(&linkedList, 'F');
printf("%d,", linkedList.length);
putchar('\n');
for (size_t i = 0; i < MAX; i++)
{
printf("%d,", linkedList.data[i].next);
}
putchar('\n');
for (size_t i = linkedList.data[MAX - 1].next; i != 0; i = linkedList.data[i].next)
{
printf("%c,", linkedList.data[i].e);
}
putchar('\n');
printf("所查找元素的位置:%d\n", location(&linkedList, '2'));
system("pause");
return 0;
}
staticLinked create() {
staticLinked linked = {
{0},
0
};
linked.data[MAX - 1].next = 0;
linked.data[MAX - 2].next = 0;
for (size_t i = 0; i < MAX - 2; i++)
linked.data[i].next = i+1;
return linked;
}
void insert(staticLinked *linked, char e) {
if (linked->length < MAX - 2)
{
//获取链表的第一个结点,为0表示没有
int endPoint = MAX - 1;
//获取链表的最后一个结点&判重(chong)
while (linked->data[endPoint].next) {
if (e == linked->data[linked->data[endPoint].next].e)
return;
endPoint = linked->data[endPoint].next;
}
//获取备用链表的第一个结点,为0表示没有
int emptyLocation = linked->data[0].next;
//获取当前空结点的下一个空结点
linked->data[0].next = linked->data[emptyLocation].next;
//插入指定数据
linked->data[emptyLocation].e = e;
//将插入的结点的下一个结点指针置为0,因为插入的结点一定是最后一个结点
linked->data[emptyLocation].next = 0;
//将插入的结点连接到链表的最后
linked->data[endPoint].next = emptyLocation;
//判断当前链表是否为空链表,如果是则将当前插入的结点作为第一个结点不是则不变
if(!linked->data[MAX - 1].next)linked->data[MAX - 1].next = emptyLocation;
//记录链表的数量
linked->length++;
}
}
void delete(staticLinked *linked, char e) {
//头结点的位置
int previous = MAX - 1;
//当前结点的直接后继
int nextPoint = linked->data[previous].next;
//判断当前结点的直接后继是否存在
while (nextPoint){
//如果存在则比较直接后继的值是否与给定值相等
//相等则进行删除操作,操作完成以后直接跳出循环,因为链表中元素唯一
if (e == linked->data[nextPoint].e) {
//previous保存待删除结点的直接前前驱
//删除
linked->data[previous].next = linked->data[nextPoint].next;
//将删除的结点挂到备用链表队列
linked->data[nextPoint].next = linked->data[0].next;
linked->data[0].next = nextPoint;
//将链表计数减一
linked->length--;
//跳出循环
break;
}
//不相等则继续查找下一个结点
previous = linked->data[previous].next;
nextPoint = linked->data[previous].next;
}
}
int location(staticLinked *linked, char e) {
//获取链表第一个结点
int location = linked->data[MAX - 1].next;
while (location){
if ( e == linked->data[location].e)
return location;
else location = linked->data[location].next;
}
return 0;
}
03-17