1.5静态链表的表示与实现
静态链表可用一维数组来描述,用游标模拟指针。游标的作用就是指示元素的直接后继。这里的游标的数据类型不是动态链表的指针类型,而是整型数字。
代码实现:
SLinkList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define ListSize 100
typedef int DataType;
typedef struct
{
DataType data;
int cur;
}SListNode;
typedef struct {
SListNode list[ListSize];
int av;
}SLinkList;
//静态链表的初始化
void InitSList(SLinkList *L)
{
for (int i = 0; i < ListSize; i++)
{
(*L).list[i].cur = i + 1;
}
(*L).list[ListSize - 1].cur = 0;
(*L).av = 1;
}
//分配结点
int AssignNode(SLinkList L)
{
int i;
i = L.av;
L.av = L.list[i].cur;
return i;
}
//回收结点
void FreeNode(SLinkList L, int pos)
{
L.list[pos].cur = L.av;
L.av = pos;
}
//插入操作
void InsertSList(SLinkList *L,int i,DataType e)
{
int j, k, x;
k = (*L).av;
(*L).av = (*L).list[k].cur;
(*L).list[k].data = e;
j = (*L).list[0].cur;
for (x = 1; x < i-1; x++)
{
j = (*L).list[j].cur;
}
(*L).list[k].cur = (*L).list[j].cur;
(*L).list[j].cur = k;
}
//删除操作
void DeleteSList(SLinkList* L, int i, DataType* e)
{
int j, k, x;
j = (*L).list[0].cur;
for (x = 1; x < i-1; x++)
{
j = (*L).list[j].cur;
}
k= (*L).list[j].cur;
(*L).list[j].cur = (*L).list[k].cur;
(*L).list[k].cur = (*L).av;
*e = (*L).list[k].data;
(*L).av = k;
}
test.c
#include <stdio.h>
#include <stdlib.h>
#include "SLinkList.h"
void PrintDList(SLinkList L, int n);
void main()
{
SLinkList L;
int i, len;
int pos;
char e;
DataType a[] = {'A','B','C','D','E','F','G'};
len = sizeof(a) / sizeof(a[0]);
InitSList(&L);
for (i = 1; i <= len; i++)
{
InsertSList(&L,i,a[i-1]);
}
printf("静态链表中的元素:");
PrintDList(L, len);
printf("输入插入的元素:");
scanf_s("%c",&e);
getchar();
printf("输入插入元素的位置:");
scanf_s("%d",&pos);
getchar();
InsertSList(&L, pos, e);
printf("插入后静态链表中的元素:");
PrintDList(L, len+1);
printf("输入删除元素的位置:");
scanf_s("%d", &pos);
getchar();
DeleteSList(&L, pos, &e);
printf("删除的元素是:");
printf("%c\n",e);
printf("删除后静态链表中的元素:");
PrintDList(L, len);
}
//输出每一个元素
void PrintDList(SLinkList L, int n)
{
int j, k;
k = L.list[0].cur;
for (j = 0; j <= n; j++)
{
printf("%4c",L.list[k].data);
k = L.list[k].cur;
}
printf("\n");
}