顺序表定位操作效率高,只要知道下标便能直接引用数据元素.但是在顺序表插入删除数据时,需要移动数据元素以确保其结构完整性. 链表定位操作需要计数器帮助,效率低下。但是插入删除元素时效率高。静态链表包含二者大部份优点(能够快速定位,插入删除数据时效率高)如下是静态链表的一个实例.
#include <stdio.h>
typedef struct Elem
{
int data;
int next; /*指定下一个元素位序*/
} Elem_p;
typedef struct node
{
Elem_p *Elem;
int length;
int size;
} NODE ;
/*创建静态链表*/
int CreatList(NODE *L,int size)
{
L->Elem = (Elem_p *)malloc(sizeof(Elem_p) * (size + 1 ));
if(L->Elem == NULL) return 0;
L->Elem[0].next = -1;
L->length = 0;
L->size = size;
return 1;
}
/*插入元素*/
int AddDate(NODE *L,int data)
{
int k = 0;
if(L->size <= L->length ) /*检查链表是否溢出*/
return 0;
/*升序插入元素*/
while(L->Elem[L->Elem[k].next].data != -1 && L->Elem[L->Elem[k].next].data < data)
{
k = L->Elem[k].next;
}
L->Elem[L->length+1].data = data;
L->Elem[L->length+1].next = L->Elem[k].next;
L->Elem[k].next = L->length+1;
(L->length)++;
}
void print(int d)
{
printf("/n %d",d);
}
/*遍历链表*/
void foreach(NODE L, void (*t)(int))
{
int k;
k = L.Elem[0].next;
while(k!= -1)
{
(*t)(L.Elem[k].data);
k = L.Elem[k].next;
}
}
/*返回指定位序索引*/
int GetElemAt(int index,NODE L,int *pre)
{
int p,k = 0;
if(index < 0 || index > L.length)
return -4;
p = 0 ;
while(p != -1 && k < index )
{
*pre = p;
p = L.Elem[p].next;
k++;
}
if(p == -1 || k > index)
return -4;
return p;
}
/*指定位序插入元素*/
int InsertElemAt(NODE *L,int index,int date)
{
int p,pre;
if(L->length >= L->size)
return 0;
if(index < 1 || index > L->length+1)
return 0;
p = GetElemAt(index-1,*L,&pre);
if(p == -4) return 0;
/*在 位序 L->Elem[p] 和 L->Elem[L->Elem[p].next] 间插入元素*/
L->Elem[L->length+1].data = date;
L->Elem[L->length+1].next = L->Elem[p].next;
L->Elem[p].next = L->length+1;
L->length++;
return 1;
}
/*删除指定位序元素*/
int DeleteElemAt(NODE *L,int index)
{
int pre,p;
p = GetElemAt(index,*L,&pre);
if(p == -4 || p == 0) return 0;
L->Elem[pre].next = L->Elem[p].next;
L->length--;
return 1;
}
void main()
{
NODE L;
int k,p;
clrscr();
CreatList(&L,7);
/*插入元素*/
AddDate(&L,1);
AddDate(&L,3);
AddDate(&L,2);
AddDate(&L,4);
AddDate(&L,5);
AddDate(&L,10);
InsertElemAt(&L,1,1);
/*遍历静态链表*/
foreach(L,print);
free(L);
}
/*因为静态链表是数组结构,其缺点:初使化时必须指定大小*/