线性表操作

线性表定义:是具有相同类型的n(>=0)个数据元素的有限序列 (a1,a2,a3.....an)。a0是线性表的第一个元素,只有一个后继;an是最后一个元素,只有一个前驱;其他元素既有前驱也有后继;线性表能够逐项访问和顺序存取

集合---创建线性表

解散---销毁线性表

长度---得到线性表的长度

出列---从线性表删除一个元素

添加---在线性表特定位置增加元素

线性表在程序中表现为一种特殊的数据类型,线性表的操作在程序中的表现为一组函数

用c语言描述线性表:

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

下面一段是SeqList.c

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

typedef unsigned int TSeqListNode;

typedef struct _tag_SeqList
{
    int capacity;
    int length;
    TSeqListNode* node;
}TSeqList;

SeqList* SeqList_Create(int capacity)
{
    TSeqList* ret = NULL;
    if(capacity >= 0)
    {
        ret = (TSeqList*)malloc(sizeof(TSeqList)+sizeof(TSeqListNode)*capacity);  //申请一段内存空间,首地址为ret
    }

    if(ret != NULL)
    {
        ret->capacity = capacity;
        ret->length = 0;
        ret->node = (TSeqListNode*)(ret+1); //指向的是结构体的末尾
    }

    return ret;

}

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

void SeqList_Clear(SeqList* list)
{
    TSeqList* sList = (TSeqList*)list;
    if(sList!=NULL)
    {
        sList->length=0;
    }
}

int SeqList_Length(SeqList* list) //实际包含数据元素的个数
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    if(sList!=NULL)
    {
        ret = sList->length;
    }

    return ret;
}

int SeqList_capacity(SeqList* list)
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    if(sList!=NULL)
    {
        ret = sList->capacity;
    }

    return ret;
}

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

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

    if(ret)
    {
        if(pos >= (sList->length))
        {
            pos = sList->length;
        }

        for(i=(sList->length); i>pos; i--)
        {
            sList->node[i] = sList->node[i-1];
        }

        sList->node[i] = (TSeqListNode)node;

        sList->length++;
    }

    return ret;
}

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

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

    return ret;
}

SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = NULL;
    int i=0;
    if((sList != NULL)&&(pos >= 0)&&(pos < sList->length))
    {
        ret = (SeqListNode*)(sList->node[pos]);
        for(i=pos+1; i<sList->length;i++)
        {
            sList->node[i-1] =  sList->node[i];
        }

        sList->length--;
    }
    return ret;
}

下面一段是头文件

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

typedef void SeqList;
typedef void SeqListNode;

/*
用于创建并且返回一个空的线性表,最大容量为capacity
*/
SeqList* SeqList_Create(int capacity);

/*
用于销毁一个线性表
*/
void SeqList_Destroy(SeqList* list);

/*
用于讲一个线性表SeqList中的所有元素清空,线性表
回到创建时的初始状态
*/
void SeqList_Clear(SeqList* list);

/*
用于返回一个线性表中所有元素个数
*/
int SeqList_Length(SeqList* list);

/*
用于返回一个线性表中所有元素个数
*/
int SeqList_capacity(SeqList* list);


/*
用于向一个线性表SeqList的pos位置插入新元素node
返回值为1表示插入成功,返回0表示插入失败
*/
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

/*
用于获取线性表SeqList的pos位置的元素node
返回值为pos位置处的元素,NULL表示获取失败
*/
SeqListNode* SeqList_Get(SeqList* list, int pos);

/*
用于删除线性表SeqList的pos位置的元素node
返回值删除的pos位置处的元素,NULL表示删除失败
*/
SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif // __2_1_H_

下面是main函数,测试顺序链表

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

int main()
{
    int index=0;
    SeqList* list = SeqList_Create(5);

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

    SeqList_Insert(list,&i,0);
    SeqList_Insert(list,&j,0);
    SeqList_Insert(list,&k,0);
    SeqList_Insert(list,&x,0);
    SeqList_Insert(list,&y,0);
    SeqList_Insert(list,&z,0);

    for(index=0; index<SeqList_Length(list); index++)
    {
        int* p = (int*)SeqList_Get(list,index);
        printf("%d\n",*p);
    }
    while(SeqList_Length(list)>0)
    {
       int *p = SeqList_Delete(list,0);
       printf("%d\n",*p);
    }
    SeqList_Destroy(list);

    return 0;
}





猜你喜欢

转载自blog.csdn.net/stormjason/article/details/80109831