1.线性表的静态链表的存储结构
#include <stdio.h>
#define ListSize 100
typedef int ElemType;
typedef struct {
ElemType data;//数据
int cur;//游标
}Component, SLinkList[ListSize];
2.静态链表初始化
int InitSList(SLinkList L)
{
int i;
for ( i = 0; i < ListSize-1; i++)
{
L[i].cur = i + 1;
}
L[ListSize - 1].cur = 0;
return 1;
}
3.分配结点
int Malloc_SLL(SLinkList L)
{
int i;
i = L[0].cur;
if (L[0].cur) {
L[0].cur = L[i].cur;//把它的下一分量用来作为备用
}
return i;
}
4.回收结点
void FreeNode(SLinkList L, int pos)
{
L[pos].cur = L[0].cur;
L[0].cur = pos;
}
5.求静态链表中元素个数,不包括头尾节点
int ListLength(SLinkList L)
{
int i = L[ListSize - 1].cur;
int j = 0;
while (i)
{
j++;
i = L[i].cur;
}
return j;
}
6.插入操作
int ListInsert(SLinkList L,int i,ElemType e)
{
int j, k, l;
k = ListSize - 1;//数组的最后一个元素
if (i<1||i>ListLength(L)-1) {
return 0;
}
j = Malloc_SLL(L);//获得空闲分量的下标
if (j) {
L[j].data = e;
for ( l = 1; l < i-1; l++)//找到第i个元素之前的位置
{
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
return 1;
}
return 0;
}
7.删除在L中的第i个数据元素
此时c处于备用链表,当垃圾清理掉了。
int ListDelete(SLinkList L, int i)
{
int j, k;
if (i<1 || i>ListLength(L))
{
return 0;
}
k = ListSize - 1;
for ( j = 0; j < i-1; j++)
{
k = L[k].cur;
}
j = L[k].cur;
L[k].cur = L[j].cur;
FreeNode(L,j);
return 1;
}
8.输出静态链表中的数据
void PrintDList(SLinkList L, int i)
{
int j, k;
k = L[0].cur;
for ( j = 0; j <=i; j++)
{
printf("%4c",L[k].data);
k = L[k].cur;
}
printf("\n");
}
9.操作台
int main()
{
SLinkList L;
int i, len;
int pos;
char e;
ElemType a[] = {'a','b','c','d','e','f','g','i'};
len = sizeof(a) / sizeof(a[0]);
InitSList(L);
for ( i = 1; i < len; i++)
{
ListInsert(L,i,a[i-1]);
}
printf("静态链表:");
PrintDList(L,len);
printf("要插入的元素及位置:");
scanf("%c",&e);
getchar();
scanf("%d",&pos);
getchar();
ListInsert(L,pos,e);
printf("插入元素后静态链表:");
PrintDList(L,len+1);
printf("要删除元素的位置:");
scanf("%d",&pos);
getchar();
ListDelete(L,pos);
printf("删除的元素是:");
printf("%c\n",L->data);
printf("删除元素后静态链表:");
PrintDList(L,len);
}