------------------------------------------------------------------------------------------------------------------------------------------------------------
静态链表相当于是用一个数组来实现线性表的链式存储结构,大概结构图如下
在静态链表中,每一个结点包含两部分内容,一部分是data(即有意义的数据),另一部分是cur(存储该元素下一个元素所在数组对应的下标)。
有几个特殊的结点:
首先是下标为0的结点中不包含有意义的数据,它的cur存储的是备用链表(即没有存储的数据的那些结点)第一个结点的下标。
其次是数组下标为1元素,它是首节点没有data, cur储存第一个有实际意义的节点数组下表;;;;
最后就是链表的最后一个元素(并不一定是数组的最后一个元素),链表最后一个元素的cur一般存放0,表示它后面的结点为空了。
-------------------------------------------------------------------------------------------------------------------------------------------------------
// 关于数据结构的总结与复习 Coding
//2.关于静态链表
#include <cstdio>
#include <cstdlib>
#define Maxsize 100
#define error 0
#define ok 1
//#define _OJ_
typedef struct Lnode
{
int data;
int cur;
} Lnode, Linklist[Maxsize];
void
Init_Space(Linklist Space)
//进行空间的初始化
{
int i = 0;
for (i = 0; i < Maxsize - 1; i++)
Space[i].cur = i + 1;
Space[Maxsize - 1].cur = 0;
}
int
Malloc_space(Linklist Space)
//space[0].cur 总是存储备用空间的第一个元素的数组下标
{
int i;
i = Space[0].cur;
if(Space[i].cur != 0)
Space[0].cur = Space[i].cur;
return i;
}
void
Free_space(Linklist Space, int k)
{
Space[k].cur = Space[0].cur; Space[0].cur = k;
}
void
build_space(Linklist Space, int n)
//space[0].cur 总是存储备用空间的第一个元素的数组下标。
// 而space[1].cur总是存储第一个节点的数组下标 即space[1]为头节点
{
int i, j;
j = Malloc_space(Space); //申请头节点 即space[1]为头节点
for (i = 0; i < n; i++) {
j = Malloc_space(Space);
scanf("%d", &Space[j].data);
}
Space[j].cur = 0; //最后一个节点为0 即null
}
int
List_Length(Linklist Space)
{
int t = Space[1].cur, cnt = 0;
while (t != 0) {
t = Space[t].cur;
cnt++;
}
printf("链表长度为:%d
", cnt);
return cnt;
}
int
List_insert(Linklist Space, int k, int data)
//对静态链表进行插入操作
{
if(k < 1 && k > List_Length(Space) + 1) {
printf("插入超限:
"); return error;
}
int i, j = 0, t = Space[1].cur;
i = Malloc_space(Space);
Space[i].data = data;
printf("从第%d个插入元素%d
", k, data);
if(k == 1) {
Space[i].cur = Space[1].cur; Space[1].cur = i;
}//考虑如果插入第一个节点的情况
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
Space[i].cur = Space[t].cur; Space[t].cur = i;
//考虑到进行其他情况包括尾节点
}
int
List_Detele(Linklist Space, int k)
//对静态链表进行删除操作
{
int t = Space[1].cur, j;
if(k < 1 && k > List_Length(Space)) {
printf("删除超限:
"); return error;
}
printf("删除第%d个元素
", k);
if(k == 1) {
// Free_space(Space, Space[1].cur);
Space[1].cur = Space[Space[1].cur].cur;
} //考虑第一个节点
if(k == List_Length(Space)) {
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
// Free_space(Space, Space[t].cur);
Space[t].cur = 0;
} //考虑最后一个节点
else {
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
// Free_space(Space, Space[t].cur);
Space[t].cur = Space[Space[t].cur].cur;
}
}
void
print(Linklist Space)
{
printf("打印输出数据:
");
int t = Space[1].cur;
while (t != 0) {
printf("data == %d ", Space[t].data);
printf("cur == %d
", Space[t].cur);
t = Space[t].cur;
}
}
void
difference(Linklist Space1, Linklist Space2)
//下面这个是求A和B的不同元素 即(A - B) U (B - A)
{
int i, t, cnt1, t1;
t = Space1[1].cur;
while (t != 0) {
t1 = Space2[1].cur; cnt1 = 0;
while (t1 != 0) {
if(Space2[t1].data == Space1[t].data) {
List_Detele(Space2, cnt1 + 1); //逐个比较有相同的元素则删除
break;
}else{
t1 = Space2[t1].cur;
cnt1++;
}
}
if(cnt1 == List_Length(Space2))
List_insert(Space2, List_Length(Space2) + 1, Space1[t].data);
//与每一个元素都不相同则插入
t = Space1[t].cur;
}
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
int n, n1, Len;
Linklist Space;
scanf("%d", &n); //printf("n == %d
", n);
Init_Space(Space);
build_space(Space, n);
print(Space);
List_Length(Space);
// List_insert(Space, 2, 10);
// List_insert(Space, 1, 11); //进行边界值的检测
// List_insert(Space, 3, 12); //进行边界值的检测
// List_insert(Space, 4, 13);
print(Space);
// List_Detele(Space, 2);
// List_Detele(Space, 1); //进行边界值的检测
// List_Detele(Space, 3); //进行边界值的检测
print(Space);
Linklist Space1, Space2;
scanf("%d", &n1);
Init_Space(Space1); Init_Space(Space2);
build_space(Space1, n1); build_space(Space2, n1);
difference(Space1, Space2);
print(Space2); print(Space1);
return 0;
}
-------------------------------------------------------------------------------------------------------------------
至此关于静态链表到此结束----------------------------
Coding-----------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------
// 关于数据结构的总结与复习 Coding
//2.关于静态链表
#include <cstdio>
#include <cstdlib>
#define Maxsize 100
#define error 0
#define ok 1
//#define _OJ_
typedef struct Lnode
{
int data;
int cur;
} Lnode, Linklist[Maxsize];
void
Init_Space(Linklist Space)
//进行空间的初始化
{
int i = 0;
for (i = 0; i < Maxsize - 1; i++)
Space[i].cur = i + 1;
Space[Maxsize - 1].cur = 0;
}
int
Malloc_space(Linklist Space)
//space[0].cur 总是存储备用空间的第一个元素的数组下标
{
int i;
i = Space[0].cur;
if(Space[i].cur != 0)
Space[0].cur = Space[i].cur;
return i;
}
void
Free_space(Linklist Space, int k)
{
Space[k].cur = Space[0].cur; Space[0].cur = k;
}
void
build_space(Linklist Space, int n)
//space[0].cur 总是存储备用空间的第一个元素的数组下标。
// 而space[1].cur总是存储第一个节点的数组下标 即space[1]为头节点
{
int i, j;
j = Malloc_space(Space); //申请头节点 即space[1]为头节点
for (i = 0; i < n; i++) {
j = Malloc_space(Space);
scanf("%d", &Space[j].data);
}
Space[j].cur = 0; //最后一个节点为0 即null
}
int
List_Length(Linklist Space)
{
int t = Space[1].cur, cnt = 0;
while (t != 0) {
t = Space[t].cur;
cnt++;
}
printf("链表长度为:%d
", cnt);
return cnt;
}
int
List_insert(Linklist Space, int k, int data)
//对静态链表进行插入操作
{
if(k < 1 && k > List_Length(Space) + 1) {
printf("插入超限:
"); return error;
}
int i, j = 0, t = Space[1].cur;
i = Malloc_space(Space);
Space[i].data = data;
printf("从第%d个插入元素%d
", k, data);
if(k == 1) {
Space[i].cur = Space[1].cur; Space[1].cur = i;
}//考虑如果插入第一个节点的情况
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
Space[i].cur = Space[t].cur; Space[t].cur = i;
//考虑到进行其他情况包括尾节点
}
int
List_Detele(Linklist Space, int k)
//对静态链表进行删除操作
{
int t = Space[1].cur, j;
if(k < 1 && k > List_Length(Space)) {
printf("删除超限:
"); return error;
}
printf("删除第%d个元素
", k);
if(k == 1) {
// Free_space(Space, Space[1].cur);
Space[1].cur = Space[Space[1].cur].cur;
} //考虑第一个节点
if(k == List_Length(Space)) {
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
// Free_space(Space, Space[t].cur);
Space[t].cur = 0;
} //考虑最后一个节点
else {
for (j = 1; j < k - 1; j++)
t = Space[t].cur;
// Free_space(Space, Space[t].cur);
Space[t].cur = Space[Space[t].cur].cur;
}
}
void
print(Linklist Space)
{
printf("打印输出数据:
");
int t = Space[1].cur;
while (t != 0) {
printf("data == %d ", Space[t].data);
printf("cur == %d
", Space[t].cur);
t = Space[t].cur;
}
}
void
difference(Linklist Space1, Linklist Space2)
//下面这个是求A和B的不同元素 即(A - B) U (B - A)
{
int i, t, cnt1, t1;
t = Space1[1].cur;
while (t != 0) {
t1 = Space2[1].cur; cnt1 = 0;
while (t1 != 0) {
if(Space2[t1].data == Space1[t].data) {
List_Detele(Space2, cnt1 + 1); //逐个比较有相同的元素则删除
break;
}else{
t1 = Space2[t1].cur;
cnt1++;
}
}
if(cnt1 == List_Length(Space2))
List_insert(Space2, List_Length(Space2) + 1, Space1[t].data);
//与每一个元素都不相同则插入
t = Space1[t].cur;
}
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
int n, n1, Len;
Linklist Space;
scanf("%d", &n); //printf("n == %d
", n);
Init_Space(Space);
build_space(Space, n);
print(Space);
List_Length(Space);
// List_insert(Space, 2, 10);
// List_insert(Space, 1, 11); //进行边界值的检测
// List_insert(Space, 3, 12); //进行边界值的检测
// List_insert(Space, 4, 13);
print(Space);
// List_Detele(Space, 2);
// List_Detele(Space, 1); //进行边界值的检测
// List_Detele(Space, 3); //进行边界值的检测
print(Space);
Linklist Space1, Space2;
scanf("%d", &n1);
Init_Space(Space1); Init_Space(Space2);
build_space(Space1, n1); build_space(Space2, n1);
difference(Space1, Space2);
print(Space2); print(Space1);
return 0;
}
-------------------------------------------------------------------------------------------------------------------
至此关于静态链表到此结束----------------------------
Coding-----------------------