数据结构之线性表(顺序表)

线性表:由同类数据元素构成的有序序列的线性结构
实现方式分两种:顺序存储实现(ArrayList)和链式存储实现(LinkList)

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

typedef struct _tag_SeqList //头节点,记录表的信息 
{
    int capacity;   //表容量   
    int length;     //表长度
    int *node;      //node[capacity],为指针素组 
}TSeqList; 

typedef void SeqList;
typedef void SeqListNode;

SeqList *SeqList_Create(int capacity);      //创建顺序表
void SeqList_Destory(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);    //在pos位置插入元素
SeqList *SeqList_Get(SeqList *list,int pos);    //获取pos位置的元素
SeqList *SeqList_Delete(SeqList *list, int pos);    //删除pos位置的元素

#endif 

SeqList.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "SeqList.h"
//创建顺序表 
SeqList *SeqList_Create(int capacity)   //返回值为SeqList*类型,即顺序表的地址 
{
    int ret;
    TSeqList *temp=NULL;
    temp=(TSeqList*)malloc(sizeof(TSeqList));   //为头节点分配地址
    if(temp==NULL)
    {
        ret=1;
        printf("func SeqList_Create() error:%d\n",ret);
        return NULL;    
    }
    memset(temp, 0, sizeof(TSeqList));
    temp->capacity=capacity; 
    temp->length=0;
    temp->node=(int*)malloc(sizeof(void*)*capacity);    //分配一个指针数组
    if(temp->node==NULL)
    {
        ret=2;
        printf("func SeqList_Create() error:%d\n",ret);
        return NULL;
    }
    return temp; 
}
//求顺序表容量
int SeqList_Capacity(SeqList *list)
{
    TSeqList *temp=NULL;
    if(list==NULL)
    {
        return;
    }
    temp=(TSeqList *)list;
    return temp->capacity;
}
//获取顺序表长度
int SeqList_Length(SeqList *list)
{
    TSeqList *temp=NULL;
    if(list==NULL)
    {
        return; 
    }   
    temp=(TSeqList *)list;
    return temp->length;
}
//插入元素 
int SeqList_Insert(SeqList *list,SeqListNode *node,int pos)
{
    int i;
    TSeqList *temp=NULL;
    if(list==NULL || node==NULL)    //健壮性判断 
    {
        return -1;
    }
    temp=(TSeqList *)list;
    if(temp->length >= temp->capacity)  //如果顺序表已满
    {
        return -2;
    }
    //容错
    if(pos >temp->length)       //如果给出的pos位置在线性表长度之后,即中间有空余 
    {
        pos=temp->length;       //就修正到最后一个元素后面 
    } 
    for(i=temp->length;i>pos;i--)   //将插入元素后的元素依次后移 
    {
        temp->node[i]=temp->node[i-1];
    }
    temp->node[i]=(SeqListNode *)node;  //腾出的位置插入新元素 
    temp->length++;             //插入成功后,长度加1 
    return 0; 
} 
//删除元素
SeqList *SeqList_Delete(SeqList *list, int pos) 
{
    int i;
    TSeqList *tlist=NULL;
    SeqListNode *temp=NULL;
    tlist=(TSeqList*)list; 
    if(list==NULL || pos<0 || pos>=tlist->capacity)
    {
        printf("SeqList_Detele() error\n");
        return NULL;
    }
    temp=(SeqListNode*)tlist->node[pos];    //要删除的元素
    for(i=pos+1;i<tlist->length;i++)
    {
        tlist->node[i-1]=tlist->node[i];
    }
    tlist->length--;
    return temp;
}
//查找元素 
SeqList *SeqList_Get(SeqList *list, int pos)
{
    TSeqList *tlist=NULL;
    SeqListNode *temp=NULL;
    tlist=(TSeqList *)list;
    if(list==NULL || pos<0 || pos>=tlist->capacity)
    {
        printf("SeqList_Get() error\n");
        return NULL;
    }
    temp=(SeqListNode *)tlist->node[pos];   //将表中pos位置的结点指针赋给temp
    return temp; 
}
//清空顺序表
void SeqList_Clear(SeqList *list)
{
    TSeqList *temp=NULL;
    if(list==NULL)
    {
        return;
    }
    temp=(SeqList*)list;
    temp->length=0;
    memset(temp->node, 0, (temp->capacity*sizeof(void*)));
    return; 
} 
//销毁顺序表
void SeqList_Destory(SeqList *list)
{
    TSeqList *temp=NULL;
    if(list==NULL)
    {
        return;
    }   
    temp=(TSeqList *)list;
    if(temp->node != NULL)
    {
        free(temp->node);   // 先释放头节点中的指针数组 
    }
    free(temp);     //在释放头节点
    return; 
} 

main.c

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

typedef struct _Teacher
{
    char name[32];
    int age;
}Teacher;

int main()
{
    int ret=0;
    int len=0;
    int i=0;
    SeqList *list=NULL;
    Teacher t1={
        "loci",
        32
    };
    Teacher t2={
        "coco",
        23
    };
    Teacher t3={
        "lili",
        21
    };
    Teacher t4={
        "fgfg",
        45
    };
    Teacher t5={
        "ktkt",
        28
    };
    //创建顺序表
    list=SeqList_Create(10);

    //插入结点
    ret=SeqList_Insert(list,(SeqListNode*)&t1,0);   //位置0表示始终头部插入 
    ret=SeqList_Insert(list,(SeqListNode*)&t2,0);
    ret=SeqList_Insert(list,(SeqListNode*)&t3,0);
    ret=SeqList_Insert(list,(SeqListNode*)&t4,0);
    ret=SeqList_Insert(list,(SeqListNode*)&t5,0);

    printf("顺序表容量:%d\n",SeqList_Capacity(list));     
    printf("顺序表长度:%d\n",SeqList_Length(list));
    len=SeqList_Length(list);

    //遍历顺序表
    printf("遍历顺序表:\n");
    for(i=0;i<len; i++)
    {
        Teacher *temp=(Teacher *)SeqList_Get(list,i);   //获取顺序表结点
        if(temp==NULL)
        {
            printf("func SeqList_Get() error\n");
            return; 
        }
        printf("teachr name:%s\tage:%d\n",temp->name,temp->age);    
    }    

    //销毁链表
    printf("销毁顺序表:\n");
    while(SeqList_Length(list)>0)
    {
        Teacher *temp=(Teacher *)SeqList_Delete(list,0);    //删除头部元素
        if(temp==NULL)
        {
            printf("func SeqList_Delete error\n");
            return; 
        }   
        printf("teachr name:%s\tage:%d\n",temp->name,temp->age);
    } 
    SeqList_Destory(list);
    system("pause");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章