国嵌数据结构学习之线性表

线性表的定义:

    线性是零个或多个数据元素的集合。

    线性表中的数据元素之间是有顺序的。

    线性表中的数据元素的个数是有限的。

    线性表中的数据元素的类型必须相同。

线性表的定义:

    线性表是具有相同类型的n(n>0)个数据元素的有限序列。

实现代码:

    相关头文件的定义:

#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 

实现的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;
    
    if(capacity >= 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_Destory(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 && (0<=pos);
   
   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;
    TSeqListNode *ret = NULL;
    
    //位置合法性判断
    if( (sList != NULL) && (0<=pos) && (pos < sList->length) )
    {
        ret = (SeqListNode*)(sList->node[pos]);    
    }
    
    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];    
        } 
        
        sList->length--;     
  }     
  
  return ret; 
} 
 

测试代码:

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

int main(int argc, char *argv[])
{
  SeqList *list = SeqList_Create(10);
  
  int i = 1;
  int j = 2;
  int k = 3;
  int x = 4;
  int y = 5;
  int z = 6;
  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);
  
  SeqList_Delete(list,5);
  
  printf("%x\n",SeqList_Get(list,5)); 
  
  SeqList_Destory(list);
  
  
  printf("Press enter to continue ...");
  getchar();	
  return 0;

}
//测试代码 
/*
 SeqList *list = SeqList_Create(10);
  
  int i = 1;
  int j = 2;
  int k = 3;
  int x = 4;
  int y = 5;
  int z = 6;
  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);     
  }
  
  SeqList_Delete(list,0); 
  SeqList_Delete(list,0); 
   
  printf("\n");
  for(index=0; index<SeqList_Length(list); index++)
  {
        int *p = (int*)SeqList_Get(list,index); 
        printf("%d\n",*p);     
  }
  
  SeqList_Destory(list);
*/


猜你喜欢

转载自blog.csdn.net/qq_34938530/article/details/80471706