靜態順序表和動態順序表 對比

jhcconan614發表於2016-12-30

靜態順序表的缺陷:

靜態順序表顯然就是裡面的記憶體是一定的,不能改變的,所以定義的時候可以定義一個巨集,然後定義一個陣列,這樣就可以在陣列中儲存資訊,而且,還可以隨時改變陣列的大小。

typedef int DataType;
#define MaxSize 10

typedef struct SeqList
{
    DataType array[MaxSize];
    size_t size;   // 有效資料元素的個數
}SeqList;

這裡寫圖片描述

不過,這樣的情況不安全,因為,每個人都可以改變的陣列的大小,這是巨集定義的缺陷,也是靜態順序表的缺陷。
下面是順序表的各種功能實現:
http://blog.csdn.net/jhcconan614/article/details/53869920

動態順序表

typedef struct strSeqList{
    DateType * array;
    size_t size;
    siz_t capacity;
}SeqList,*pSeqList;

這裡寫圖片描述

標頭檔案:

#include <stdio.h>  
#include <stdlib.h>   
#include <malloc.h>  
#include <assert.h> 

typedef int DataType;  
typedef unsigned size_t; 

typedef struct SeqList_D  {  
 DataType* array;          //指向資料塊的指標           
 size_t size;              //當前資料數  
 size_t capacity;          //總容量           
}SeqList_D;  

void InitSeqList_D(SeqList_D* pseq_d);  //初始化函式
int IsFullCapacity(SeqList_D* pseq_d);  //判滿函式
int IsEmptyCapacity(SeqList_D* pseq_d);  //判空函式
void PushBack(SeqList_D* pseq_d,DataType data);//尾插函式  
void PopBack(SeqList_D* pseq_d);  //尾刪函式
void PrintSeq(SeqList_D* pseq_d); //列印函式

函式部分:

#include "SeqList_D.h"  

void InitSeqList_D(SeqList_D* pseq_d)  
{  
 assert(pseq_d);  
 pseq_d->array = (DataType*)malloc(sizeof(DataType) * 3);  
 pseq_d->size = 0;  
 pseq_d->capacity = 3;  
}  

void PushBack(SeqList_D* pseq_d,DataType data)  
{  
    assert(pseq_d);  
    if(IsFullCapacity(pseq_d))//full  
    {  
        pseq_d->capacity = pseq_d->capacity * 2 + 3;  
        pseq_d->array = (DataType*)realloc(pseq_d->array, sizeof(DataType) * pseq_d->capacity);  
    }  
    pseq_d->array[pseq_d->size++] = data;  
}

int IsFullCapacity(SeqList_D* pseq_d)  
{  
 if(pseq_d->size >= pseq_d->capacity)  
 {  
  return 1;   //full  
 }  
 else  
 {  
  return 0;    
 }  
}

int IsEmptyCapacity(SeqList_D* pseq_d)  
{  
 if(pseq_d->size <= 0)  
 {  
  return 1;   //empty  
 }  
 else  
  return 0;  
} 

void PopBack(SeqList_D* pseq_d)  
{  
 if(IsEmptyCapacity)  
 {  
  printf("SeqList is Eempty");  
  return;  
 }  
 else  
 {  
  pseq_d->size--;  
 }  
}  

void PrintSeq(SeqList_D* pseq_d)  
{  
 int i = 0;  
 for(;i < pseq_d->size; i++)  
 {  
  printf("%d->", pseq_d->array[i]);  
 }  
}    

測試函式:

#include "SeqList_D.h"  

void text1()  
{  
 SeqList_D s1;  
 InitSeqList_D(&s1);  
 PushBack(&s1, 1);  
 PushBack(&s1, 2);  
 PushBack(&s1, 3);  
 PushBack(&s1, 4);  
 PushBack(&s1, 5);  
 PrintSeq(&s1);  
}  

int main()  
{  
 text1();  
 system("pause");  
 return 0;

相關文章