1. 程式人生 > 實用技巧 >線性表之順序儲存

線性表之順序儲存

線性表:零個或者多個元素的有序佇列
從定義裡我們就可以看出,線性表是一個序列,就代表他們之間是有順序的。
就像幼兒園小朋友放學回家,手搭手站成一列一樣,每個小朋友的前後都會有一個小朋友,除了最後一個小朋友(他前面有小朋友,後面沒有小朋友)和第一個小朋友(他前面沒有小朋友,後面有小朋友)
在資料結構中我們把這種關係叫做直接前驅和直接後繼,線性表中第一個元素沒有直接前驅,最後一個元素沒有直接後繼,其餘的都是一對一的關係。
根據儲存結構,我們把線性表分為兩類

  1. 順序儲存
  2. 鏈式儲存
    今天我們就來討論一下線性表的順序儲存
    何為順序儲存?
    通俗的來講,就是在記憶體中開闢連續的地址單元,說起來連續的地址單元,首先我們想到的就是陣列,所以我們就可以利用陣列來實現順序連結串列的實現。
#define MAXSIZE 100
typedef int ElemType;//為了方便以後修改資料
typedef struct
{
    ElemType data[MAXSIZE];
    int length;//用來記錄連結串列的長度
} SqList;

上面就是連結串列順序儲存的結構程式碼
有了結構程式碼,我們就可以寫出單鏈表的各種操作了
單鏈表的建立

SqList creat(SqList list)
{
    list.length=-1;//連結串列的初始化
    int a;
    scanf("%d",&a);
    while(a!=-1&&list.length<=MAXSIZE-1)//當a為-1的時候結束連結串列的輸入
    {
        list.length++;
        list.data[list.length]=a;
        scanf("%d",&a);
    }
    return list;
}

在單鏈表的某一位置插入值

SqList Insert(SqList list,int i,ElemType x)//i為插入的位置,x為插入的元素
{
    if(list.length>=MAXSIZE-1)
        printf("連結串列已經滿了\n");
    if(i<0)
        printf("元素插入的位置不對\n");
    for(int n=list.length; n>=i-1; n--)
    {
        list.data[n+1]=list.data[n];
    }
    list.data[i-1]=x;
    list.length++;
    return list;
}

刪除單鏈表某一位置的值

SqList Delet(SqList list,int n)//n為刪除的位置
{
    if(n<0||n>=MAXSIZE)
        printf("刪除的位置不對");
    for(int i=n-1; i<=list.length; i++)
    {
        list.data[i]=list.data[i+1];
    }
    list.length--;//刪除了一個所以要減一
    return list;
}

得到單鏈表某一位置的值

int GetElem(SqList list,int position)//在這裡要注意,順序表中位置和下標的關係,因為陣列是從0開始存的,而位置是從1開始的,所以位置=下標+1
{
    return list.data[position-1];
}

--------------------------------------------------------------------
下面給出完整程式碼

#include<stdio.h>
#define MAXSIZE 100
typedef int ElemType;//為了方便以後修改資料
typedef struct
{
    ElemType data[MAXSIZE];
    int length;//用來記錄連結串列的長度
} SqList;
SqList creat(SqList list);//連結串列的新建
SqList Insert(SqList list,int i,ElemType x);//插入操作
SqList Delet(SqList list,int n);//刪除操作
int GetElem(SqList list,int position);//查詢操作
void print(SqList list);
int main()
{
    SqList listA;
    listA=creat(listA);
    print(listA);
    listA=Insert(listA,1,9);
    print(listA);
    listA=Delet(listA,5);
    print(listA);
}
SqList creat(SqList list)
{
    list.length=-1;//連結串列的初始化
    int a;
    scanf("%d",&a);
    while(a!=-1&&list.length<=MAXSIZE-1)//當a為-1的時候結束連結串列的輸入
    {
        list.length++;
        list.data[list.length]=a;
        scanf("%d",&a);
    }
    return list;
}
SqList Insert(SqList list,int i,ElemType x)//i為插入的位置,x為插入的元素
{
    if(list.length>=MAXSIZE-1)
        printf("連結串列已經滿了\n");
    if(i<0)
        printf("元素插入的位置不對\n");
    for(int n=list.length; n>=i-1; n--)
    {
        list.data[n+1]=list.data[n];
    }
    list.data[i-1]=x;
    list.length++;
    return list;
}
SqList Delet(SqList list,int n)//n為刪除的位置
{
    if(n<0||n>=MAXSIZE)
        printf("刪除的位置不對");
    for(int i=n-1; i<=list.length; i++)
    {
        list.data[i]=list.data[i+1];
    }
    list.length--;//刪除了一個所以要減一
    return list;
}
int GetElem(SqList list,int position)//在這裡要注意,順序表中位置和下標的關係,因為陣列是從0開始存的,而位置是從1開始的,所以位置=下標+1
{
    return list.data[position-1];
}
void print(SqList list)
{
    for(int i=0; i<=list.length; i++)
        printf("%d ",list.data[i]);
    printf("\n");
}

博主是一個小萌新,也許會有錯誤的地方和不完善的地方,寫部落格就是為了和大家交流,如果有不對的地方請大家指正!隨時和博主交流!