日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

顺序表---C语言

發布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 顺序表---C语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎概念

順序表示

采用順序存儲是表示線性表最簡單的方法

  • 將線性表中的元素依次存儲在一片相鄰的存儲區域中
  • 元素之間邏輯上的相鄰關系通過元素在計算機物理位置上的相鄰關系來表示
  • 邏輯上相鄰 = 存儲位置相鄰
  • 順序表示的線性表也成 順序表
存儲結構

線性表的首地址基地址

-順序表中k0的存儲位置 loc(k0)

順序表的實現

以數組為基礎實現線性表
考慮到線性表元素的變化,創建一個大數組,表示元素連續存在數組前一段

  • 需要記錄表中實際元素個數
  • 連續存放給刪除操作帶來不便
  • 數組固定大小可能導致插入操作失敗
順序表的存儲示意圖

算法分析與評價
  • 在有n個元素的線性表里下標為i的元素前插入一個元素需要移動n-i個元素,刪除下標為i的元素需要移動n-i-1個元素

  • 插入的平均移動次數:

  • 刪除的平均移動次數:

可以看出,在順序表中進行一次插入刪除操作,平均需要移動大約一半的元素

順序表插入刪除操作的平均時間代價最壞時間代價都是O(n);

  • 兩種特殊情況:表后端插入/刪除的時間代價為O(1)
  • 定位:一次定位平均需要和n/2個元素比較,時間代價為O(n)
  • 特殊情況:如果順序表中的元素按照值得升序(降)序排列,則使用二分法使得定位操作的時間代價減少到O(log2n)

代碼實現

#include <stdio.h> #include <stdlib.h>typedef int DataType; struct SeqList {int MAXNUM; // 順序表中最大元素的個數int n; // 存放線性表中元素的個數 n<=MAXNUMDataType *element; // element[0],element[1]...element[n-1] 存放線性表中的元素 }; typedef struct SeqList * PSeqList;//創建空順序表 PSeqList createNullList_seq(int m) {PSeqList palist;palist = (PSeqList)malloc(sizeof(struct SeqList));if(palist != NULL){palist->element = (DataType*)malloc(sizeof(DataType)*m);if(palist->element != NULL){palist->MAXNUM = m;palist->n = 0; // 空表長度為 0return palist;}else{free(palist); // 存儲分配失敗}}printf("Out of space.\n"); // 存儲分配失敗return NULL; }// 判斷線性表是否為空 // 若為空返回1,否則返回0 int isNull_seq(PSeqList palist) {return (palist->n == 0); }// 查詢順序表中某元素的下標 int locate_seq(PSeqList palist, DataType x) {for(int q=0;q<palist->n;q++){if(palist->element[q] == x)return q;}return -1; }// 順序表插入 指定下標 p 的后面 // p:下標 x: 插入的值 int insertPre_seq(PSeqList palist, int p, DataType x) {int q;// 判斷是否溢出(也就是是不是存滿了)if(palist ->n >= palist->MAXNUM ) {printf("Overflow!");return 0;}// 下標 p 不存在判斷if(p<0 || p>palist->n){printf("Not Exist!\n");return 0;}for(q = palist->n-1;q>=p;q--)palist -> element[q+1] = palist ->element[q];palist->element[p] = x;palist->n = palist->n+1;return 1; }// 順序表插入 指定下標p的后面 // p:下標 x: 插入的值 int insertPost_seq(PSeqList palist, int p, DataType x) {int q;// 判斷是否已經存滿 滿了則溢出if(palist->n >= palist->MAXNUM){printf("Overflow!");return 0;}// 判斷下標p是否存在if(p<0 || p>palist->n){printf("Not Exist!\n");return 0;}for(q=palist->n-1;q>p;q--)palist->element[q+1]=palist->element[q];palist->element[p+1] = x;palist->n = palist->n+1;return 1; }// 刪除指定下標的元素 int deleteP_seq(PSeqList palist,int p) {int q;// 判斷下標p是否有效if(p<0 || p>palist->n){printf("Not Exist!\n");return 0;}for(q=p;q<palist->n-1;q++)palist->element[q] = palist->element[q+1]; // 刪除元素之后的元素均向前移一個位置palist->n = palist->n-1; // 元素個數減一return 1; }// 輸出順序表內容 void print_seq(PSeqList palist) {printf("-----輸出順序表---------\n");printf("存儲元素數量:%d\n",palist->n);printf("最多存儲數量:%d\n",palist->MAXNUM);printf("\n");printf("下標 值\n");for(int i=0;i<palist->n;i++){printf(" %d ",i);printf(" %d\n",palist->element[i]);}}int main(){PSeqList pList;// 創建空順序表pList = createNullList_seq(1000);//判斷是否為空if(isNull_seq(pList) == 1){printf("Empty list.\n");}//插入數據insertPre_seq(pList, 0, 2);insertPre_seq(pList, 0, 666);insertPre_seq(pList, 1, 123);insertPost_seq(pList,0, 520);insertPost_seq(pList,2, 1314);// 輸出順序表print_seq(pList);// 打印指定值的下標printf("520的下標為:%d\n",locate_seq(pList, 520));// 刪除下標為3的值deleteP_seq(pList, 3);// 輸出順序表print_seq(pList);return 0; }

總結

以上是生活随笔為你收集整理的顺序表---C语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。