C#操作window檔案目錄
阿新 • • 發佈:2021-10-22
線性表的順序儲存是指,在記憶體中用地址連續的一塊儲存空間,順序存放線性表的各元素,用這種儲存形式儲存的線性表成為順序表。
順序表的基本操作
1. 順序表的結構定義
首先我們來定義順序表
typedef struct LNode{ int data[MAX]; int Length; }SeqList; int arr[]={1,5,6,3,9,7};/* 定義一個要輸入的陣列 */
2. 初始化順序表
SeqList *ListCreat(){ SeqList *L; L=(SeqList *)malloc(sizeof(SeqList)); for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的資料 */ L->data[i] = arr[i]; } L->Length=sizeof(arr)/4; return L; }
3. 插入運算
線性表的插入是指在第i個位置插入元素x,插入後使原表長n變為n+1,順序表上插入運算主要步驟如下:
將ai~an的元素順序向後移動,將x放到空出的第i個位置,修改表長
int ListInsert(SeqList *L, int pos, int ele){ if(pos>L->Length+1 || pos<1){ printf("位置錯"); return -1; /* 檢查插入位置正確性 */ } if(L->Length == MAX){ /* 表滿 */ printf("表滿"); return 0; } for (int i = L->Length-1; i > pos-2; i--){ L->data[i+1]=L->data[i]; /* 節點移動 */ } L->data[pos-1] = ele; /* 新元素插入 */ L->Length++; /* 表長+1 */ return 1; /*插入成功返回1 */ }
時間複雜度O(n),n/2。
4. 刪除元素
刪除運算的主要步驟為:將ai+1~an順序向前移動,修改表長。
int ListDel(SeqList *L,int pos){ if(pos>L->Length || pos<1){ /* 檢查刪除位置合法性 */ printf("無法刪除第%d個元素",pos); return 0; } for(int i=pos-1; i < L->Length; i++){ L->data[i]=L->data[i+1]; /* 移動元素 */ } L->Length--; /* 修改表長 */ return 1; /* 刪除成功 */ }
時間複雜度O(n),(n+1)/2
5. 查詢元素
在順序表中查詢元素時,從第一個元素開始依次與元素x比較,直到與找到一個與x相等的資料元素,返回他在順序表中的儲存下標,如果沒有找到,則返回-1。
int ListSerach(SeqList *L,int x){ int i=0; while (i<L->Length && L->data[i]!=x){ i++; } if (i>L->Length-1) return -1; /* 查詢失敗,返回-1 */ else return i; /* 查詢成功返回所在位置 */ }
時間複雜度:O(n),(n+1)/2。
完整程式碼:
#include "stdio.h" #include <stdlib.h> #define MAX 20 typedef struct LNode{ int data[MAX]; int Length; }SeqList; int arr[]={1,5,6,3,9,7};/* 定義一個要輸入的陣列 */ /* 初始化順序表 */ SeqList *ListCreat(){ SeqList *L; L=(SeqList *)malloc(sizeof(SeqList)); for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的資料 */ L->data[i] = arr[i]; } L->Length=sizeof(arr)/4; return L; } /* 插入元素 */ int ListInsert(SeqList *L, int pos, int ele){ if(pos>L->Length+1 || pos<1){ printf("位置錯"); return -1; /* 檢查插入位置正確性 */ } if(L->Length == MAX){ /* 表滿 */ printf("表滿"); return 0; } for (int i = L->Length-1; i > pos-2; i--){ L->data[i+1]=L->data[i]; /* 節點移動 */ } L->data[pos-1] = ele; /* 新元素插入 */ L->Length++; /* 表長+1 */ return 1; /* 插入成功返回1 */ } /* 刪除指定位置元素 */ int ListDel(SeqList *L,int pos){ if(pos>L->Length || pos<1){ /* 檢查刪除位置合法性 */ printf("無法刪除第%d個元素",pos); return 0; } for(int i=pos-1; i < L->Length; i++){ L->data[i]=L->data[i+1]; /* 移動元素 */ } L->Length--; /* 修改表長 */ return 1; /* 刪除成功 */ } /* 查詢元素 */ int ListSerach(SeqList *L,int x){ int i=0; while (i<L->Length && L->data[i]!=x){ i++; } if (i>L->Length-1) return -1; /* 查詢失敗,返回-1 */ else return i; /* 查詢成功返回所在位置 */ } /* 顯示連結串列 */ void displayList(SeqList *L){ printf("\nL的內容:"); for (int i = 0; i < L->Length; i++) { printf("%d ",L->data[i]); } printf("\n"); } int main(){ int i,e; SeqList *L = ListCreat(); displayList(L); printf("請輸入插入的位置:"); scanf("%d",&i); printf("請輸入插入的資料:"); scanf("%d",&e); ListInsert(L,i,e); displayList(L); printf("要查詢的元素"); scanf("%d",&e); i = ListSerach(L,e)+1; printf("元素%d的位置是%d\n",e,i); printf("請輸入刪除的位置:"); scanf("%d",&i); ListDel(L,i); displayList(L); }點這裡檢視完整程式碼