數據結構之線性表(順序表)

線性表:由同類數據元素構成的有序序列的線性結構
實現方式分兩種:順序存儲實現(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;
}

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