線性表的相關操作-初始化、增添、刪除

Alfred king發表於2020-09-29

線性表的定義

線性表是具有相同資料型別的n個元素的有限序列,n是表長(每個元素佔的空間是一樣的)
ai是線性表中的“第i個”元素線性表中的位序(位序從1開始,陣列下標從0開始)

線性表的初始化和簡單遍歷

#include <stdio.h>
#include "stdlib.h"
#define maxsize 10

typedef struct {
    int data[maxsize];//用靜態的陣列存放資料元素
    int length;//線性表當前長度
}SqList;
//初始化順序表
void Initilist(SqList &L){//此處引用需要在C++環境進行,C語言環境編譯不出來,&L對引數的修改結果帶過來
    int i;
    for(i=0;i<maxsize;i++)
        L.data[i]=0;//將所有資料元素預設為初始值
    L.length=0;//順序表的初始長度為0

}
int main() {
    SqList L;//宣告一個順序表
    Initilist(L);//初始化順序表
    for(int i=0;i<maxsize;i++){
        printf("%d ",L.data[i]);
    }
}

這是通過靜態分配去實現線性表的初始化

要值得注意的是,若一開始沒有講相應的資料預設初始化為0,將會出現“髒資料”的情況

通過動態分配實現

因為靜態分配的方法不能改變陣列的長度,而且如果靜態分配的空間太小,容易造成資料溢位,但是如果分配空間太大容易造成空間的浪費。因此這裡我們需要考慮動態分配記憶體的方式
動態分配實現的基本套路

L.data=(ElemType *)malloc(sizeof(Elemtype) *InitiSize)
//ElemType 指的是資料型別 InitSize初始化的長度大小
#include<stdio.h>
#include "stdlib.h"
#define InitSize 10
typedef struct {
    int *data;//動態分配陣列的指標
    int maxsize;//順序表最大容量
    int length;//當前長度
}Sqlist;
void IniLIst(Sqlist &L){
    L.data=(int *)malloc(sizeof(int )*InitSize);
    //動態分配空間
    L.length=0;
    L.maxsize=InitSize;
}
//增加長度
void Increase(Sqlist *L,int len){
     int *p=L->data;
     L->data=(int *)malloc(sizeof(int)*(len+L->maxsize));
     for(int i=0;i<L->length;i++){
         L->data[i]=p[i];//將資料複製到新區域
     }
    L->length=L->maxsize+len;//順序表最大長度增加N
     free(p);
}

插入操作

bool ListInsert(Sqlist &L,int i,int e){
    if(i<1||i>L.length+1)//判斷i的範圍是否有效
       return false
    if(L.length>=MaxSize)//當前儲存空間已滿,不能插入
       return false
      for(int j=L.length;j>=i;i--)//將第i個元素往後移
         L.data[j]=L.data[j-1];
         L.data[i-1]=e;//位置i是指位序,對應陣列下標要減1
         L.length+=1;
         return True;
         }

插入的時間複雜度為O(N)

刪除操作

bool delete(Sqlist &L,int i,int &e)
if(i<1||i>L.length)
return false;
e=L.data[i-1];//將被刪除元素賦值給e
for(int j=i;j<L.length;j++)//從前面的元素依次移動
		L.data[j-1]=L.data[j];//元素前移
		L.length--;
	return true;

相關文章