一、创建一个可复用的顺序线性表

来源:互联网 发布:linux如何安装xz 编辑:程序博客网 时间:2024/06/08 01:10
一、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;
}

执行结果:







0 0
原创粉丝点击