1.定义静态链表
//定义静态链表
typedef struct StaticLinknode{
int data;
int cur;//游标
}*Nodeptr;
typedef struct StaticLinklist{
Staticlist nodes;
int *used
}*ListPtr;
2.静态链表初始化
//静态链表的初始化
Staticlist Initialist()
{
Staticlist tempHeader=(ListPtr)malloc(sizeof(StaticLinklist));
tempPtr->nodes=(NodePtr)malloc(sizeof(StaticLinknode)*Maxsize);
tempPtr->used=(int*)malloc(sizeof(int)*Maxsize);
tempPtr->nodes[0].data=0;
tempPtr->nodes[0].cur=-1;
tempPtr->used[0]=1;
int i;
for(i=0;i<Maxsize;i++)
{
tempPtr->used[i]=0;
}
return tempHeader;
}
3.分配空间
//分配空间
int malloclist( Nodeptr array)
{
int i=array[0].cur;
if(i)
{
array[0].cur=array[i].cur;
}
return i;
}
4.打印链表
//打印链表
void printlist(ListPtr tempHeader)
{
int p=0;
while(p!=-1)
{
printf("%d",tempHeader->nodes[p].data);
p=tempHeader->nodes[p].cur;
}
printf("\n");
}
5.插入元素
//插入元素
void Insertelem(ListPtr tempHeader,int elem,int position)
{
p=0;
int i;
int q;
for(i=0;i<position;i++)
{
p=tempHeader->nodes[p].cur;
if(p==-1)
{
printf("The position %d is beyond the scope of the list\n");
return;
}
}
for(i=1;i<Maxsize;i++)
{
if(tempHeader->used[i]==0)
printf("Space at %d allocated\n");
tempHeader->used[i]=1;
q=i;
break;
}
if(i==Maxsize)
{
printf("NO space\n");
return;
}
tempHeader->nodes[q].data=elem;
printf("linkling\n");
tempHeader->nodes[q].cur=tempHeader->nodes[p].cur;
tempHeader->nodes[p].next=q;
}
6.删除元素
//删除元素
void deleteelem(ListPtr tempHeader,int elem)
{
int p,q;
p=0;
while((tempHeader->nodes[p].cur!=-1)&&tempHeader->nodes[tempHeader->nodes[p].cur].data!=elem)
{
p=tempHeader->nodes[p].cur;
}
if(tempHeader->nodes[p].next==-1)
{
printf("Cannot delete\n");
return;
}
q=tempHeader->nodes[p]->cur;
tempHeader->nodes[p].next==tempHeader->nodes[tempHeader->nodes[p].cur].cur;
tempHeader->used[q]=0;
}
7.与动态链表的区别
静态链表具有快速访问元素,快速增加或删除元素的优点,静态链表中并没有指针去指示下一个元素而是通过“游标”实现的,静态链表是类似于数组的方法实现的在物理地址上是连续的需要提前分配空间大小,它的初始长度一般是固定的,在做插入和删除操作时不需要移动元素仅需要修改指针