线性表实例

来源:互联网 发布:linux导出mysql数据表 编辑:程序博客网 时间:2024/06/11 16:16

线性表的本质:

由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 cleanCC=gcc -g main:main.o seqlist.o    $(CC) $^ -o $@ clean:    rm -rf *.o main
0 0
原创粉丝点击