听了国嵌唐老师的课,用C语言实现:

数据结构:静态链表_#define


StaticList.h

#ifndef _STATICLIST_H
#define _STATICLIST_H

typedef void StaticList;
typedef void StaticListNode;

StaticList* StaticList_Create(int capacity);

void StaticList_Destory(StaticList* list);

void StaticList_Clear(StaticList* list);

int StaticList_Length(StaticList* list);

int StaticList_Capacity(StaticList* list);

int StaticList_Insert(StaticList* list,StaticListNode* node,int pos);

StaticListNode* StaticList_Get(StaticList* list,int pos);

StaticListNode* StaticList_Delete(StaticList* list,int pos);

#endif

StaticList.c

#include <stdio.h>
#include <malloc.h>
#include "StaticList.h"

#define AVAILABLE -1
typedef struct _tag_StaticListNode
{
unsigned int data;
int next;
}TStaticListNode;

typedef struct _tag_StaticList
{
int capacity;
TStaticListNode header;
TStaticListNode node[];
}TStaticList;

StaticList* StaticList_Create(int capacity)
{
TStaticList* ret = NULL;
int i=0;

if(capacity >= 0)
{
ret = (TStaticList*)malloc(sizeof(TStaticList)+sizeof(TStaticListNode)*(capacity+1));
}

if(ret != NULL)
{
ret->capacity = capacity;
ret->header.data = 0;
ret->header.next = 0;

for(i=1;i<=capacity;i++)
{
ret->node[i].next = AVAILABLE;
}
}

return ret;
}

void StaticList_Destory(StaticList* list)
{
free(list);
}

void StaticList_Clear(StaticList* list)
{
TStaticList* sList = (TStaticList*)list;
int i = 0;

if(sList != NULL)
{
sList->header.data = 0;
sList->header.next = 0;

for(i=1;i<=sList->capacity;i++)
{
sList->node[i].next = AVAILABLE;
}
}
}

int StaticList_Length(StaticList* list)
{
TStaticList* sList = (TStaticList*)list;
int ret = -1;

if(sList != NULL)
{
ret = sList->header.data;
}

return ret;
}

int StaticList_Capacity(StaticList* list)
{
TStaticList* sList = (TStaticList*)list;
int ret = -1;

if(sList != NULL)
{
ret = sList->capacity;
}

return ret;
}

int StaticList_Insert(StaticList* list,StaticListNode* node,int pos)
{
TStaticList* sList = (TStaticList*)list;
int ret = (sList != NULL);
int current = 0;
int index = 0;
int i = 0;

ret = ret && (sList->header.data+1<=sList->capacity);
ret = ret && (pos>=0) && (node != NULL);

if(ret)
{
for(i = 1;i<sList->capacity;i++)
{
if(sList->node[i].next == AVAILABLE)
{
index =i;
break;
}
}

sList->node[index].data = (unsigned int)node;

sList->node[0] = sList->header;

for(i=0;(i<pos)&&(sList->node[current].next != 0);i++)
{
current = sList->node[current].next;
}

sList->node[index].next = sList->node[current].next;
sList->node[current].next = index;

sList->node[0].data++;

sList->header = sList->node[0];
}

return ret;
}

StaticListNode* StaticList_Get(StaticList* list,int pos)
{
TStaticList* sList = (TStaticList*)list;
StaticListNode* ret = NULL;
int current = 0;
int object = 0;
int i=0;

if((sList != NULL)&&(pos>=0)&&(pos<sList->header.data))
{
sList->node[0] = sList->header;

for(i=0;i<pos;i++)
{
current = sList->node[current].next;
}

object = sList->node[current].next;

ret = (StaticListNode*)(sList->node[object].data);
}

return ret;
}

StaticListNode* StaticList_Delete(StaticList* list,int pos)
{
TStaticList* sList = (TStaticList*)list;
StaticListNode* ret = NULL;
int current = 0;
int object = 0;
int i=0;

if((sList != NULL)&&(pos>=0)&&(pos<sList->header.data))
{
sList->node[0] = sList->header;

for(i=0;i<pos;i++)
{
current = sList->node[current].next;
}

object = sList->node[current].next;

sList->node[current].next = sList->node[object].next;

sList->node[0].data--;

sList->header = sList->node[0];

sList->node[object].next = AVAILABLE;

ret = (StaticListNode*)(sList->node[object].data);
}

return ret;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
{
StaticList* list = StaticList_Create(10);

int index = 0;

int i = 0;
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;

StaticList_Insert(list,&i,0);
StaticList_Insert(list,&j,0);
StaticList_Insert(list,&k,0);

for(index=0;index<StaticList_Length(list);index++)
{
int *p = (int*)StaticList_Get(list,index);

printf("%d\n",*p);
}

printf("\n");

while(StaticList_Length(list)>0)
{
int *p = (int*)StaticList_Delete(list,0);

printf("%d\n",*p);
}

printf("\n");

StaticList_Insert(list,&x,0);
StaticList_Insert(list,&y,0);
StaticList_Insert(list,&z,0);

printf("Capacity: %d Length: %d\n",StaticList_Capacity(list),StaticList_Length(list));

for(index=0;index<StaticList_Length(list);index++)
{
int *p = (int*)StaticList_Get(list,index);

printf("%d\n",*p);
}

StaticList_Destory(list);

return 0;
}

运行效果:

数据结构:静态链表_i++_02