一、創建一個可複用的順序線性表

一、SeqList.h


 #ifndef  _SEQLIST_H_
#define  _SEQLIST_H_


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);        //在線性表插入一個元素
SeqListNode*   SeqList_Get(SeqList*  list,int   pos);                             //獲取線性表某個位置的元素
SeqListNode*   SeqList_Delete(SeqList*  list,int  pos);                       //刪除線性表的某個元素
#endif




二、SeqList.c


#include<stdio.h>
#include<malloc.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;          //地址初始化爲NULL
      if(capacity>=0)                       //最大容量大於0時,進入
       {
               ret=(TSeqList*)malloc(sizeof(TSeqList)+sizeof(TSeqListNode)*capacity)          //分配內存空間地址
       }
        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=(SeqList*)list;     //將線性表強制轉化爲SeqList類型的
   if(sList!=NULL)                                  //判斷線性表是否爲空
    {
           sList->length=0;                        //將當前的長度置0,清空鏈表中的所有元素
     }
}


int  SeqList_Length(SeqList*  list)          //獲取線性表當前的長度
{
     TSeqList*  sList=(TSeqList*)list;       //將線性表強制轉化爲SeqList類型的
    if(sList!=NULL)                                          //判斷線性表是否爲空
     { 
            ret=sList->length;                             //將鏈表當前的長度的值賦給ret
      }
        return    ret;                                            //返回ret的值
}


int  SeqList_Capacity(SeqList*  list)         //獲取線性表當前容量的最大值
{
      TSeqList*  sList=(TSeqList*)list;       //將線性表強制轉化爲SeqList類型的
       ret=-1;                                                    //ret置爲-1,當線性表爲null時,返回錯誤提示
       if(sList!=NULL)                                    //判斷鏈表是否爲null
        { 
                 ret=sList->capacity;                 //將線性表的最大容量值賦給ret
         }
             return  ret;
}


int   SeqList_Insert(SeqList*  list,SeqListNode*  node,int  pos)    //在某個位置插入某個元素
{
              TSeqList*  sList=(TSeqList*)list;                 //將線性表強制轉化爲SeqList類型的            
               int  ret =(sList!=NULL);                                //判斷線性表是否合法(線性表不能爲null)
                int  i=0;
               ret=ret&&(sList->length+1<=sList->capacity);   //判斷插入位置是否合法(插入的位置應該從0開始,但不能大於最大的容量值)
               ret=ret&&(0<=pos);
 
                if(ret)
                 {
                           if(pos>=sList->length)
                            {
                                    pos=sList->length;         //如果插入的位置大於線性表當前的長度,則將視插入的位置爲最後一位
                            }
                  for(i=sList->length;i>pos;i--)          //從最後一位開始,到pos的後一位進行循環依次向後移一位
                     {
                          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) && (0 <= pos) && (pos < sList->length) )   //判斷線性表的是否合法,以及獲取的位置是否合法
    {
        ret = (SeqListNode*)(sList->node[pos]);                                 //將獲取的元素賦值給ret
    }
    
    return ret;
}




SeqListNode* SeqList_Delete(SeqList* list, int pos) //刪除線性表某個位置的元素
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = SeqList_Get(list, pos);    //將要刪除的元素獲取出來
    int i = 0;
    
    if( ret != NULL )
    {
        for(i=pos+1; i<sList->length; i++)      
        {
            sList->node[i-1] = sList->node[i];   //將pos後面一位到最後一位依次向前移一個位置
        }
        
        sList->length--;   //長度減一
    }
    
    return ret;

}



第一二部分創建了可複用的順序線性表,一個完整的順序線性表表達成功;

接着我們進行第三步,通過main函數進行編寫,也可稱爲線性表的操作;


三、main.c

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


/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main(int argc, char *argv[]) 
{
    SeqList* list = SeqList_Create(5);
    
    int i = 0;
    int j = 1;
    int k = 2;
    int x = 3;
    int y = 4;
    int z = 5;
    int index = 0;
    
    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);
    }
    
    printf("\n");
    
    while( SeqList_Length(list) > 0 )
    {
        int* p = (int*)SeqList_Delete(list, 0);
        
        printf("%d\n", *p);
    }
    
    SeqList_Destroy(list);
    
    return 0;
}

執行結果:







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