您的位置:首页 > 其它

线性表实例

2015-08-02 20:08 267 查看
线性表的本质:

由0个或多个数据元素组成的集合
数据元素之间是顺序的
数据元素个数是有限的
数据元素的类型必须是相同的


专业的定义:

线性表是具有相同类型的n(n>=0)个数据元素的有限序列(a0,a1,a2,...an)
ai是表项,n是长度


性质:

a0为线性表中的第一个元素,只有一个后继
an为线性表中的最后一个元素,只有一个前驱
除了a0和an之外的其他元素ai,既有一个直接前驱,也有一个直接后继
线性表能够逐项访问和顺序存取


线性表的操作

创建
销毁        //销毁这个序列,
清空        //有这个序列,但都被清空
删除
插入
获取表中某个位置的数据元素
获得线性表的长度


线性表的顺序存储结构

线性表的顺序结构指的是用一段地址连续的存储单元依次存储线性表的数据元素


优缺点

优点:可以快速的获得表中的数据
缺点:增加和删除的时候会有大量的节点移动


实例如下:

//seqlist.h文件

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

typedef unsigned int SeqListNode;
typedef struct _list
{
int capacity;   //最大容量
int length;     //当前元素个数
SeqListNode *node;      //起始地址
}SeqList;

SeqList *SeqList_Create(int capacity);
void SeqList_Destroy(SeqList *list);
void SeqList_Clear(SeqList *list);
int SeqList_Length(SeqList *list);
int SeqList_Capacity(SeqList *list);
int SeqList_Insert(SeqList *list,SeqListNode *node,int pos);
SeqListNode *SeqList_Get(SeqList *list,int pos);
SeqListNode *SeqList_Delete(SeqList *list,int pos);

#endif //__SEQLIST_H__


//seqlist.c文件

#include <stdlib.h>

#include "seqlist.h"

SeqList *SeqList_Create(int capacity)
{
SeqList *ret = NULL;

if(capacity >= 0)
{
ret = malloc(sizeof(SeqList) + sizeof(SeqListNode)*capacity);
}

if(ret != NULL)
{
ret->capacity = capacity;
ret->length = 0;
ret->node = (SeqListNode *)(ret+1);
}

return ret;
}

void SeqList_Destroy(SeqList *list)
{
free(list);
}

void SeqList_Clear(SeqList *list)
{
if(list != NULL)
list->length = 0;       //当前元素个数
}

int SeqList_Length(SeqList *list)
{
int ret = -1;

if(list != NULL)
{
ret = list->length;
}
return ret;
}

int SeqList_Capacity(SeqList *list)
{
int ret = -1;

if( list != NULL )
ret = list->capacity;

return ret;
}

int SeqList_Insert(SeqList *list,SeqListNode *node,int pos)
{
int i;
int ret = (list!=NULL) && (node!=NULL);

ret = ret && (pos>=0) && (list->length+1<=list->capacity);

if( ret )
{
if( pos > list->length )
pos = list->length;
for( i=list->length;i>pos;i-- )
{
list->node[i] = list->node[i-1];
}
list->node[i] = (unsigned int)node; //这里只能是i,不能是pos,也不能是length,这里是指针强转换为int型,经常这样做,
list->length++;
}

return ret;
}

SeqListNode *SeqList_Get(SeqList *list,int pos)
{
SeqListNode *ret = NULL;

if( list!=NULL && (0<=pos && pos<list->length) )
{
ret = (SeqListNode *)(list->node[pos]);
}

return ret;
}

SeqListNode *SeqList_Delete(SeqList *list,int pos)
{
int i;
SeqListNode *ret = SeqList_Get(list,pos);

if( ret!=NULL )
{
for(i=pos+1; i<=list->length; i++)
{
list->node[i-1] = list->node[i];
}
list->length--;
}

return ret;
}


//main.c

#include <stdio.h>
#include <stdlib.h>

#include "seqlist.h"

int main( void )
{
int i;
int j;
int a[10] = {};
SeqList *list = SeqList_Create(10);

printf("Capacit = %d\n",SeqList_Capacity(list));
printf("length = %d\n",SeqList_Length(list));

for(i=0;i<10;i++)
{
a[i] = i+1;
SeqList_Insert(list, a+i, 0);
for(j=0; j<SeqList_Length(list); j++)
{
printf("%d ",*SeqList_Get(list,j));
}
printf("\n");
}

while (SeqList_Length(list) > 0)
{
int *ret = (int *)SeqList_Delete(list,0);
printf("d %d\n",*ret);
}

SeqList_Destroy(list);

return 0;
}


//Makefile

.PHONY : main clean

CC=gcc -g

main:main.o seqlist.o
$(CC) $^ -o $@

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