1. 程式人生 > >順序表(線性表的順序儲存結構)及C語言實現

順序表(線性表的順序儲存結構)及C語言實現

1.邏輯結構上呈線性分佈的資料元素在實際的物理儲存結構中也同樣相互之間緊挨著,這種儲存結構稱為線性表的順序儲存結構

也就是說,邏輯上具有線性關係的資料按照前後的次序全部儲存在一整塊連續的記憶體空間中,之間不存在空隙,這樣的儲存結構稱為順序儲存結構。使用順序儲存結構儲存的資料,第一個元素所在的地址就是這塊儲存空間的首地址。通過首地址,可以輕鬆訪問到儲存的所有的資料,只要首地址不丟,資料永遠都能找著(一根繩上的螞蚱,要有就都有)。

使用線性表的順序儲存結構生成的表,稱為順序表。

2.順序表的增刪改查

#include <stdio.h>
#include <stdlib.h>
#define Size 4

	//自定義順序表的結構
	typedef struct Table {
		int * head; //聲明瞭一個名為head的長度不確定的陣列
		int length;//記錄了當前順序表的長度
		int size;//記錄了順序表的儲存容量
	}table;

	//順序表的建立,初始化
	table initTable() {
		table t;
		t.head = (int*)malloc(Size * sizeof(int));//構造一個空的順序表,動態申請儲存空間,
		if (!t.head) //如果申請失敗,作出提示並直接退出程式
		{
			printf("初始化失敗");
			exit(0);
		}
		t.length = 0;//空表的長度初始化為0
		t.size = Size;//空表的初始儲存空間為Size
		return t;
	}

	//查詢順序表元素
	int selectTable(table t, int elem) {
		for (int i = 0;i < t.length;i++) {
			if (t.head[i]=elem) {
				return i + 1;
			}
	 	}
		return -1;//如果查詢失敗,返回-1

	}

	//更改函式,呼叫查詢演算法找到該資料元素的位置,直接在該位置上更改。
	table amendTable(table t, int elem, int newElem) {
		int add = selectTable(t, elem);
		t.head[add - 1] = newElem;//由於返回的是元素在順序表中的位置,所以-1就是該元素在陣列中的下標
		return t;
	}

	//插入函式,其中,elem為插入的元素,add為插入到順序表的位置
	table addTable(table t, int elem, int add)
	{
		//判斷插入本身是否存在問題(如果插入元素位置比整張表的長度+1還大(如果相等,是尾隨的情況),
		//或者插入的位置本身不存在,程式作為提示並自動退出)
		if (add > t.length + 1 || add < 1) {
			printf("插入位置有問題");
			return t;
		}
		//做插入操作時,首先需要看順序表是否有多餘的儲存空間提供給插入的元素,如果沒有,需要申請
		if (t.length == t.size) {
			t.head = (int *)realloc(t.head, (t.size + 1) * sizeof(int));
			if (!t.head) {
				printf("儲存分配失敗");
				return t;
			}
			t.size += 1;
		}
		//插入操作,需要將從插入位置開始的後續元素,逐個後移
		for (int i = t.length - 1; i >= add - 1; i--) {
			t.head[i + 1] = t.head[i];
		}
		//後移完成後,直接將所需插入元素,新增到順序表的相應位置
		t.head[add - 1] = elem;
		//由於添加了元素,所以長度+1
		t.length++;
		return t;
	}

	//在陣列中刪除元素時
	table delTable(table t, int add) {
		if (add > t.length || add < 1) {
			printf("被刪除元素的位置有誤");
			exit(0);
		}
		//刪除操作
		for (int i = add; i < t.length; i++) {
			t.head[i - 1] = t.head[i];
		}
		t.length--;
		return t;
	}


	void displayTable(table t) {
		for (int i = 0;i < t.length;i++) {
			printf("%d", t.head[i]);
		}
		printf("\n");
	}
	int main() {
		table t1 = initTable();//建立物件
		for (int i = 1; i <= Size; i++) {
			t1.head[i - 1] = i;
			t1.length++;
		}
		printf("原順序表:\n");
		displayTable(t1);

		printf("刪除元素1:\n");
		t1 = delTable(t1, 1);
		displayTable(t1);

		printf("在第2的位置插入元素5:\n");
		t1 = addTable(t1, 5, 2);
		displayTable(t1);

		printf("查詢元素3的位置:\n");
		int add = selectTable(t1, 3);
		printf("%d\n", add);

		printf("將元素3改為6:\n");
		t1 = amendTable(t1, 3, 6);
		displayTable(t1);
		return 0;
	}

結果:

3.bug:元素三的位子是2,將元素修改後應為2464~~不知道程式哪裡有問題?待解決