您的位置:首页 > 其它

静态链表

2015-11-08 23:14 337 查看
静态链表的定义

顺序表数组中的元素有两个数据域组成:data和next

data域用于存储数据

next域用于存储下一个元素在数组中的下标



静态链表的逻辑结构



静态链表相关定义



静态链表操作

获取第pos个元素操作

判断线性表是否合法

判断位置是否合法

由表头开始通过next域移动pos次后,当前元素的next与即要获取元素在数组中的下标



插入元素到位置pos的算法

判断线性表是否合法

判断插入位置是否合法

在数组中查找空闲位置index

由表头开始通过next域移动pos次后,当前元素的next域为要插入的位置

将新元素插入

线性表长度加1

插入操作





删除第pos个元素的算法

判断线性表是否合法

判断插入位置是否合法

获取第pos个元素

将第pos个元素从链表中删除

线性表长度减1





StaticList.h


#ifndef_STATICLIST_H_

#define_STATICLIST_H_


typedefvoidStaticList;

typedefvoidStaticListNode;


/*该方法用于创建并且返回一个空的线性表*/

StaticList*StaticList_Create(intcapacity);


/*该方法用于销毁一个线性表list*/

voidStaticList_Destory(StaticList*list);


/*该方法用于讲一个显示表list中的所有元素清空,使得线性表回到创建时的初始状态*/

voidStaticList_Clear(StaticList*list);


/*该方法用于返回一个线性表list中的所有元素个数*/

intStaticList_Length(StaticList*list);


/*该方法用于返回一个线性表list中的最大容量*/

intStaticList_Capacity(StaticList*list);


/*该方法用于向一个线性表list的pos位置处插入新元素node返回值为1表示掺入成功,0表示插入失败*/

intStaticList_Insert(StaticList*list,StaticListNode*node,intpos);


/*该方法用于获取一个线性表list的pos位置处的元素返回值为pos位置处的元素,NULL表示获取失败*/

StaticListNode*StaticList_Get(StaticList*list,intpos);


/*该方法用于删除一个线性表list的pos位置处的元素返回值为被删除的元素,NULL表示删除失败*/

StaticListNode*StaticList_Delete(StaticList*list,intpos);


#endif


StaticList.c



#include<stdio.h>

#include<malloc.h>

#include"StaticList.h"


//标记空闲位置

#defineAVAILABLE-1


//节点结构体定义

typedefstruct_tag_StaticListNode

{

unsignedintdata;

intnext;//存储下标

}TStaticListNode;

//静态链表结构体定义

typedefstruct_tag_StaticList

{

intcapacity;

TStaticListNodeheader;

TStaticListNodenode[];

}TStaticList;



/*该方法用于创建并且返回一个空的线性表*/

StaticList*StaticList_Create(intcapacity)//O(n)

{

TStaticList*ret=NULL;

inti=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;

//初始化标记所有存储空间值为-1

for(i=1;i<=capacity;i++)

{

ret->node[i].next=AVAILABLE;

}

}


returnret;

}


/*该方法用于销毁一个线性表list*/

voidStaticList_Destory(StaticList*list)

{

free(list);

}


/*该方法用于讲一个显示表list中的所有元素清空,使得线性表回到创建时的初始状态*/

voidStaticList_Clear(StaticList*list)

{

TStaticList*sList=(TStaticList*)list;

inti=0;


if(sList!=NULL)

{

sList->header.data=0;

sList->header.next=0;

for(i=0;i<=sList->capacity;i++)

{

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

}

}

}


/*该方法用于返回一个线性表list中的所有元素个数*/

intStaticList_Length(StaticList*list)//O(1)

{

TStaticList*sList=(TStaticList*)list;

intret=-1;


if(sList!=NULL)

{

ret=sList->header.data;

}


returnret;

}


/*该方法用于返回一个线性表list中的最大容量*/

intStaticList_Capacity(StaticList*list)//O(1)

{

TStaticList*sList=(TStaticList*)list;

intret=-1;


if(sList!=NULL)

{

ret=sList->capacity;

}


returnret;

}


/*该方法用于向一个线性表list的pos位置处插入新元素node返回值为1表示掺入成功,0表示插入失败*/

intStaticList_Insert(StaticList*list,StaticListNode*node,intpos)//O(n)

{

TStaticList*sList=(TStaticList*)list;

intret=(sList!=NULL);

intcurrent=0;

intindex=0;//可用位置的下标

inti=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=(unsignedint)node;

//指向表头(第0个下标指向表头)

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

//由表头开始通过next域移动pos次后,当前元素的next域为要插入的位置

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

{

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

}


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

//当前元素的next是新元素的位置

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

//数据长度加1

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


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

}

returnret;

}


/*该方法用于获取一个线性表list的pos位置处的元素返回值为pos位置处的元素,NULL表示获取失败*/

StaticListNode*StaticList_Get(StaticList*list,intpos)//O(n)

{

TStaticList*sList=(TStaticList*)list;

StaticListNode*ret=NULL;

intcurrent=0;

intobject=0;

inti=0;


if((sList!=NULL)&&(0<=pos)&&(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);

}


returnret;

}


/*该方法用于删除一个线性表list的pos位置处的元素返回值为被删除的元素,NULL表示删除失败*/

StaticListNode*StaticList_Delete(StaticList*list,intpos)

{

TStaticList*sList=(TStaticList*)list;

StaticListNode*ret=NULL;

intcurrent=0;

intobject=0;//获取当前元素下标

inti=0;


if((sList!=NULL)&&(0<=pos)&&(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);

}


returnret;

}


main.c


#include<stdio.h>

#include<stdlib.h>

#include"StaticList.h"

/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/


intmain(intargc,char*argv[])

{

StaticList*list=StaticList_Create(10);


intindex=0;


inti=0;

intj=1;

intk=2;

intx=3;

inty=4;

intz=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:%dLength:%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);


return0;

}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: