1. 程式人生 > >用C語言實現順序表的增刪查改和逆置

用C語言實現順序表的增刪查改和逆置

在資料結構中,我們最開始接觸的就是順序表,那麼順序表是什麼呢?順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。

既然它有陣列的特點,又具有線性這一特徵,那麼最基本的增、刪、查、改、逆置肯定是必須掌握的,今天我們來盤點一下怎樣對順序表中的元素進行增刪查改和逆置。

函式原型:
void InitSeqList(PSeqList seq);   //初始化順序表
void PushBack(PSeqList pSeqList, DataType data
); //尾插法插入元素 void PopBack(PSeqList pSeqList); //尾插法移出元素 void PushFront(PSeqList pSepList, DataType data); //頭插法插入元素 void PopFront(PSeqList pSeqList); //頭插法移出元素 void Insert(PSeqList pSeqList, int pos, DataType data); //任意位置插入元素 void Erase(PSeqList pSeqList, int pos); //刪除指定位置的元素 int Find(PSeqList pSeqList, DataType data
); //查詢元素 void Remove(PSeqList PseqList, DataType data); //刪除指定元素 int Empty(PSeqList pSeqList); //判滿 void PrintSeqList(PSeqList pSeqList); //列印順序表 void Inverse(PSeqList pSeqList); //逆置順序表 void Change(PSeqList pSeqList,DataType data1,DataType data2); //將順序表中指定元素進行修改
原始碼如下:
#include<stdio.h>
#include<string.h>
#include<assert.h> #define MAX_SIZE 10 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; int size; }SeqList,*PSeqList; void InitSeqList(PSeqList seq) //初始化順序表 { memset(seq->array,0,MAX_SIZE*(sizeof(DataType))); seq->size=0; } int Empty(PSeqList seq) //判滿 { if(seq->size > MAX_SIZE) return 1; else return 0; } void PushBack(PSeqList seq, DataType data) //尾插法插入元素 { assert(seq); //設定斷言,檢測是否為空 if(Empty(seq)) { return; } seq->array[seq->size]=data; seq->size++; } void PopBack(PSeqList seq) //尾插法刪除元素 { assert(seq); if(Empty(seq)) { return; } --seq->size; } void PushFront(PSeqList seq, DataType data) //頭插法插入元素 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=seq->size;i>0;i--) { seq->array[i]=seq->array[i-1]; } seq->array[0]=data; seq->size++; } void PopFront(PSeqList seq) //頭插法刪除元素 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<seq->size-1;i++) { seq->array[i]=seq->array[i+1]; } --seq->size; } void Insert(PSeqList seq, int pos, DataType data) //任意位置插入元素 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=seq->size;i>pos;i--) { seq->array[i]=seq->array[i-1]; } seq->array[pos]=data; seq->size++; } void Erase(PSeqList seq, int pos) //刪除任意位置元素 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=pos;i<seq->size;i++) { seq->array[i]=seq->array[i+1]; } --seq->size; } int Find(PSeqList seq, DataType data) //在順序表中查詢元素 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<seq->size;i++) { if(seq->array[i]==data) { printf("%d在順序表的第%d位置\n",data,i+1); return; } } printf("順序表中不存在該元素!\n"); return; } void Remove(PSeqList seq, DataType data) //在順序表中刪除給定元素 { int j=0; int i=0; int ret=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<seq->size;i++) { if(seq->array[i]==data) { for(j=i;j<seq->size-1;j++) { seq->array[j]=seq->array[j+1]; } --seq->size; return; } } printf("%d不存在!\n",data); } void PrintSeqList(PSeqList seq) //列印順序表 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<seq->size;i++) { printf("%d ",seq->array[i]); } printf("\n"); } void Inverse(PSeqList seq) //順序表的逆置 { int i=0; int temp=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<(seq->size)/2;i++) { temp=seq->array[i]; seq->array[i]=seq->array[seq->size-1-i]; seq->array[seq->size-1-i]=temp; } } void Change(PSeqList seq,DataType data1,DataType data2) //將順序表中指定元素進行修改 { int i=0; assert(seq); if(Empty(seq)) { return; } for(i=0;i<seq->size;i++) { if(seq->array[i]==data1) { seq->array[i]=data2; return; } } printf("%d不存在!\n",data1); }
測試函式:
void text()
{
    SeqList seq;
    InitSeqList(&seq);    //初始化
    PrintSeqList(&seq);

    PushBack(&seq,1);
    PushBack(&seq,2);
    PushBack(&seq,3);
    PushBack(&seq,4);
    PushBack(&seq,5);
    PushBack(&seq,6);
    PushBack(&seq,7);    //尾插法插入元素
    PrintSeqList(&seq);

    PopBack(&seq);       //尾插法移出元素
    PrintSeqList(&seq);

    PushFront(&seq,8);
    PushFront(&seq,9);    //頭插法插入元素
    PrintSeqList(&seq);

    PopFront(&seq);       //頭插法移出元素
    PrintSeqList(&seq);

    Insert(&seq,3,10);    //插入元素
    PrintSeqList(&seq);

    Erase(&seq,3);        //刪除元素
    PrintSeqList(&seq);

    Inverse(&seq);       //逆置
    PrintSeqList(&seq);

    Find(&seq,9);        //查詢
    PrintSeqList(&seq);

    Remove(&seq,9);      //刪除指定元素
    PrintSeqList(&seq);

    Change(&seq,9,2);    //修改指定元素
    PrintSeqList(&seq);
}

int main()
{
    text();
    system("pause");
    return 0;
}

在這裡我們可以對順序表做一個總結:

  1. 實現方法簡單。在很多高階語言中都有陣列型別,總體是比較容易實現的。
  2. 每個元素的儲存位置可以用一個簡單的公式來計算。
  3. 查詢和列印操作都以線性的時間來執行,移出元素花費的時間比較固定。所以非常適合於那些需要經常進行查詢操作的情況。
  4. 順序儲存的空間是靜態分配的,需要事先指定MAX_SIZE的大小。也因此可能會造成空間的浪費。
  5. 插入和刪除的代價非常高昂,這兩種操作在最壞的情況下的時間複雜度為O(n),平均估計這兩種操作需要移動一半的元素。

在順序表中插入或者刪除一個元素,是非常複雜的,它需要把元素一個一個移動,然後插入或者刪除。所以在順序表做插入或刪除是很浪費的行為,平均每個結點移動的次數約為表長的一半,時間複雜度相對而言也比較高。如果建立的模型有太多需要插入刪除的元素,是否選用順序表就需要綜合考慮了。