【數據結構】線性表(1)順序表基礎及簡單操作


【數據結構】線性表

線性表是n個數據元素的有限序列。
線性表是一種邏輯結構,表是元素之間一對一的相鄰關系。
順序表和鏈表是指存儲結構。

特點

  1. 表中元素個數有限
  2. 表中元素具有邏輯上的順序性,表中元素有其先后次序
  3. 表中元素都是數據元素,每個元素都是單個元素
  4. 每個元素占有相同大小的存儲空間

順序表

線性表的順序存儲又稱為順序表。用一組地址連續的存儲單元一次存儲線性表中的數據元素。邏輯上相鄰的兩個元素在物理位置上也相鄰

一維數組空間分配

靜態分配

數組的大小和空間已經固定,一旦空間站慢,再加入新的數據將會產生溢出,程序就會崩潰。

動態分配

存儲數組的空間是在程序執行過程中通過動態存儲分配語句分配的,一旦數據空間占滿,就另外開辟一塊更大的存儲空間,用來替換原來的存儲空間。
⚠️:動態分配仍然是順序存儲結構,物理結構沒有變化,依然是隨機存取方式,只是分配的空間大小可以在運行時決定。

特點

  1. 隨機訪問,通過首地址和元素序號可在時間O(1)內找到指定的元素。
  2. 存儲密度高,每個節點只存儲數據元素。
  3. 邏輯上相鄰的元素物理上也相鄰,當執行插入刪除操作時,需要移動大量的元素。

基本操作的實現

插入操作

由於表中元素的物理位置是相鄰的,所以當插入新元素的時候就需要對表中的元素進行整體移動。

操作描述:在順表L的第i個位置插入新元素e。若i的輸入不合法,則返回原表並顯示錯誤提示,表示插入失敗;否則,將順序表的第i個元素及其后的所有元素向右移動一個位置,騰出一個空位置插入新元素e,順序表長度增加1,插入成功返回已插入的表。

//插入操作
sqlist addlist (sqlist &l,int elem,int add)//插入操作,傳入表、插入的數字和第add個位置
{
    if (add>l.length+1||add<1) {//判斷選擇插入的位置是否在表內
        printf("插入位置有問題");
        return l;
    }
    for (int i=l.length-1; i>=add-1; i--) {
//設置int型變量i來記錄數組下標,初始設置i為3,當i大於等於指定位置的數組下標時,i-1.直到i小於指定位置的下標時,結束循環
//注意傳入的是第幾個位置,而不是數組下標
        l.head[i+1]=l.head[i];//數組下標i+1存i的數值
    }
    l.head[add-1]=elem;//最后插入正確位置
    l.length++;
    return l;
}

刪除操作

刪除順序表L中第i個位置的元素,若成功則返回刪除后的表,並打印被刪除的元素,否則返回false

//刪除操作
sqlist delList(sqlist &l,int i){
    if(i>l.length||i<1){
        printf("erro");
        exit(0);
    }
    int e=l.head[i-1];
    printf("%d",e);
    printf("\n");
    for(int j=i;j<l.length;j++){
        l.head[j-1]=l.head[j];
    }
    l.length--;
    return l;
}

按值查找(順序查找)

在順序表中查找第一個數值為e的元素,並返回其位序。

//按值查找
int locateElem(sqlist l,int e){
    for(int i=0;i<l.length;i++){
        if(l.head[i]==e){
            int j=i+1;
            printf("在第%d個位置",j);
            return i+1;
        }
    }
    return 0;
}
//插入刪除操作全部可運行代碼
#include <stdio.h>
#include <stdlib.h>
#define InitSize 4//初始長度
typedef struct{
	int *head;//指示動態數組分配的指針
	int length;
	int Size;
}sqlist;

sqlist initList(){
	sqlist l;
	l.head=(int*)malloc(InitSize*sizeof(int));//初始化動態分配
	if(!l.head){
		printf("erro\n");
		exit(0);
	}
	l.length=0;
	l.Size=InitSize;
	return l;
}
void DispalyList(sqlist l){
	for(int i=0;i<l.length;i++){
		printf("%d",l.head[i]);
	};
	printf("\n");
}
sqlist addlist (sqlist &l,int elem,int add)
{
    if (add>l.length+1||add<1) {
        printf("插入位置有問題");
        return l;
    }
    for (int i=l.length-1; i>=add-1; i--) {
        l.head[i+1]=l.head[i];
    }
    l.head[add-1]=elem;
    l.length++;
    return l;
}
sqlist delList(sqlist &l,int i){
    if(i>l.length||i<1){
        printf("erro");
        exit(0);
    }
    int e=l.head[i-1];
    printf("%d",e);
    printf("\n");
    for(int j=i;j<l.length;j++){
        l.head[j-1]=l.head[j];
    }
    l.length--;
    return l;
}
int locateElem(sqlist l,int e){
    for(int i=0;i<l.length;i++){
        if(l.head[i]==e){
            int j=i+1;
            printf("在第%d個位置",j);
            return i+1;
        }
    }
    return 0;
}
int main()
{
   sqlist l=initList();
   for(int i=1;i<=InitSize;i++){
		l.head[i-1]=i;
		l.length++;
   };
	DispalyList(l);
	addlist(l,0,1);
	DispalyList(l);
	delList(l,2);
	DispalyList(l);
	locateElem(l,0);
   return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM