写这个写了几次,然后都没写完就关掉了,所以也不想多码字了,直接上代码吧(本来还认真自制了一张图片来理解静态链表的cursor与sub之间的关系)但其实也就那么回事:通过游标来找下标通过下标找到对应的数据。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int Element;
typedef struct {
Element data;
int cursor;
/* 游标的作用是用来寻找当前元素指向的下标的位置的元素 */
}SqList, staticLinkList[MAXSIZE];
/* 声明所有函数 */
Status InitList();
int GetLength();
int Malloc();
int GetElem();
Status InsertNode();
void Free();
Status DeleteNode();
/* 初始化链表中的cursor */
Status InitList(staticLinkList space) {
int i;
for (i = 0; i < MAXSIZE - 1; i++) space[i].cursor = i + 1;
space[MAXSIZE - 1].cursor = 0;
return TRUE;
}
/* 获取链表长度 */
int GetLength(staticLinkList space) {
int j = 0;
int i = MAXSIZE - 1;
while (space[i].cursor) {
i = space[i].cursor;
j++;
}
return j;
}
int Malloc(staticLinkList space) {
int i = space[0].cursor;
if (space[0].cursor) space[0].cursor = space[i].cursor;
return i;
}
/* 读取当前位置的元素 */
int GetElem(staticLinkList space, int i) {
int j = 1, k = space[MAXSIZE - 1].cursor;
Element receData;
if (i < 1 || i > GetLength(space)) return 0;
while (k && j < i) {
k = space[k].cursor;
j++;
}
receData = space[k].data;
return receData;
}
/* 数据插入 */
Status InsertNode(staticLinkList space, int i, Element receData) {
int j, k, l;
k = MAXSIZE - 1;
if (i < 1 || i > GetLength(space)) return FALSE;
j = Malloc(space);
if (j) {
space[j].data = receData;
for (l = 1; l < i; l++) k = space[k].cursor;
space[j].cursor = space[k].cursor;
space[k].cursor = j;
return TRUE;
}
return 0;
}
void Free(staticLinkList space, int i) {
space[i].cursor = space[0].cursor;
space[0].cursor = i;
}
/* 数据删除 */
Status DeleteNode(staticLinkList space, int i) {
int j, k;
if (i < 1 || i > GetLength(space)) return FALSE;
k = MAXSIZE - 1;
for (j = 1; j < i; j++) k = space[k].cursor;
j = space[k].cursor;
space[k].cursor = space[j].cursor;
Free(space, j);
return TRUE;
}
int main() {
char c;
int n, Pos, receData;
/* receData用来接收数据、Pos是位置 */
Element receElem;
staticLinkList space;
InitList(space); //初始化列表游标
printf("请问您要建立一个多大的表格?\n");
scanf("%d", &n);
int k = MAXSIZE - 1;
space[k].cursor = 1;
/** 从下标为1的位置开始赋值 */
for (int i = 0; i < n; i++) {
k = space[k].cursor;
space[k].data = i + 1;
}
space[0].cursor = space[k].cursor;
/** 输入完毕后将当前下标 k 对应的游标赋给下标0的游标 */
space[k].cursor = 0;
/**再将当前下标 k 的游标变为0 (即将最后输入的数据的游标变为0,
* 也就是说最后一个数据的后面指向第一个备用空间NULL,
* 而备用空间的下一个数据是备用空间的游标指向的最后一个数据的后一位(NULL))
*/
printf("显示数据:\n");
k = MAXSIZE - 1;
space[k].cursor = 1;
for (int i = 0; i < n; i++) {
k = space[k].cursor;
printf("%d ", space[k].data);
}
puts("按 1 可进行查询 按 2 可进行数据插入");
puts("按 3 可进行数据删除 按 q 退出程序");
while ((c = getch()) != 'q') {
int j;
if (c == '1') {
printf("请输入要查询的数据位置:");
scanf("%d", &Pos);
receData = GetElem(space, Pos);
printf("%d\n", receData);
}
if (c == '2') {
printf("请输入要插入数据和位置:");
scanf("%d,%d", &receElem, &Pos);
InsertNode(space, Pos, receElem);
j = MAXSIZE - 1;
space[j].cursor = 1;
while (space[j].cursor) {
j = space[j].cursor;
printf("%d ", space[j].data);
}
putchar('\n');
}
if (c == '3') {
printf("请输入要删除数据的位置:");
scanf("%d", &Pos);
DeleteNode(space, Pos);
j = MAXSIZE - 1;
space[j].cursor = 1;
while (space[j].cursor) {
j = space[j].cursor;
printf("%d ", space[j].data);
}
putchar('\n');
}
}
return 0;
}