【數據結構基礎筆記】【順序表】

代碼參考《妙趣橫生的算法.C語言實現》

文章目錄

  • 前言
    • 1、創建順序表
    • 2、順序表插入元素
    • 3、順序表刪除元素
    • 4、順序表實例分析
      • 1、靜態
      • 2、動態
    • 5、順序表總結


前言

本章總結:從靜態和動態分別進行順序表的創建、插入、刪除、以及實例分析


1、創建順序表

1、靜態地生成一張順序表

#define MaxSize=100;
ElemType Sqlist[MaxSize];
int len;
//len表示順序表的長度

2、動態地生成一張順序表

#define MaxSize 10typedef int ElemType;	typedef struct{int *elem;		//指向順序表首地址elemint length;		//順序表中表的長度(元素個數)int listsize;	//順序表的存儲空間容量
}Sqlist;
void initSqlist(Sqlist* L)
{L->elem = (int*)malloc(MaxSize*sizeof(ElemType));	//開辟內存,并將該段空間首地址賦值給L->elemif (!L->elem){printf("分配內存失敗");exit(0);}						//如果分配內存失敗,返回L->length = 0;										//生成一張空的順序表L->listsize = MaxSize;
}

靜態定義,表占用的內存空間開辟在內存的靜態區,也就是函數棧上,該區域的從內存空間會隨著函數調用的完成而被系統自動回收。動態生成一個順序表,內存空間開辟在內存的動態區上,也就是堆內存上,這個區域的內存空間不會被系統自動回收,需要程序主動釋放.

2、順序表插入元素

在長度為n的順序表中的第i個位置插入新元素item

1、靜態表

void InsertElem(ElemType Sqlist[],int &n,int i,ElemType item)
{//向順表中Sqlist中第i個位置插入元素item,順序表原長為nint t;if(n==MaxSize || i<1 ||i>n+1)	exit(0);	//非法插入:判斷插入元素的位置是否對,或者表是否已滿,因為表的內存大小是固定不變的。for(t=n-1;t>=i-1;t--)	Sqlist[t+1]=Sqlist[t];		//將i-1后的元素往后移動一個元素Sqlist[i-1]=item;				//在i位置上插入元素itemn=n+1;							//數組長度+1
}

2、動態表,如果順序表已滿,可以追加一段內存空間

void InsertElem(Sqlist* L, int i, ElemType item)
{//向順序表L中第i個位置插入元素itemElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1){printf("非法插入");exit(0);}	//非法插入if (L->length >= L->listsize){base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));//重新追加空間L->elem = base;		//更新內存基地址L->listsize = L->listsize + 100;		//存儲空間增大100單元}insertPtr = &(L->elem[i - 1]);		//insertPtr為插入位置for (p = &(L->elem[L->length - 1]);p >= insertPtr;p--)*(p + 1) = *p;						//將i-1以后的元素順序往后移動一個元素位置*insertPtr = item;					//在第i個位置插入元素L->length++;
}

3、順序表刪除元素

刪除第i個位置元素的方法:將第i個位置以后的元素依次前移,從而覆蓋掉第i個元素

1、靜態表

void DelElem(ElemType Sqlist[],int &n,int i)
{int j;if(i<1 || i>n) exit(0);		//非法刪除、for(j=i;j<n;j++)Sqlist[j-1]=Sqlist[j];//將第i個位置以后的元素依次前移n--;		//表長-1
}

2、動態表

void DelElem(Sqlist* L, int i)
{ElemType* delItem, * q;if (i<1 || i>L->length){printf("非法刪除");exit(0);}delItem = &(L->elem[i - 1]);	//delItem指向表中第i個元素q = L->elem + L->length - 1;			//q指向表尾for (++delItem;delItem <= q;++delItem)*(delItem - 1) = *delItem;		//將第i位置以后的元素依次前移L->length--;				//表長-1
}

4、順序表實例分析

1、靜態

題目要求:
創建一個靜態的順序表存放整數,大小為10,完成以下操作:
1、輸入6個整數,打印出順序表中的內容,并顯示表中剩余的空間個數
2、在順序表中第3個位置插入元素0,打印出順序表中的內容,并顯示表中剩余的空間個數
3、試圖向表中第11個位置插入整數0,程序提示超出范圍
4、刪除表中的第6個元素,打印出順序表中的內容,并顯示表中剩余的空間個數

#include "stdio.h"
#define MaxSize 10//基本操作//
//向順序表中插入元素  Sqlist:表首地址 *len:表的長度  i:待插入元素的位置 x:待插入元素的元素值
void insertElem(int Sqlist[], int* len, int i, int x)
{int t;if (i<1 || i> * len + 1 || *len == MaxSize)	//非法插入操作,或者數組元素已滿{printf("This insert is illegal\n");return;}for (t = *len - 1;t >= i - 1;t--)Sqlist[t + 1] = Sqlist[t];Sqlist[i - 1] = x;			//插入元素*len = *len + 1;
}
//向順序表中刪除元素 Sqlist:表首地址	*len:表的長度 i:插入元素的位置
void DelElem(int Sqlist[], int* len, int i)
{int j;if (i<1 || i>*len){printf("This insert is illgel\n");return;}for (j = i;j <= *len - 1;j++)Sqlist[j - 1] = Sqlist[j];*len = *len - 1;
}
void show_sqlist(int Sqlist[],int len)
{int i = 0;for (i = 0;i < len;i++)printf("%d", Sqlist[i]);
}
//測試函數
int main()
{int Sqlist[MaxSize];	//定義一個靜態順序表int len=0;int i;printf("please input six interger number\n");for (i = 0;i < 6;i++){scanf("%d", &Sqlist[i]);len++;}show_sqlist(Sqlist, len);printf("\nthe spare length is %d\n", MaxSize - len);insertElem(Sqlist, &len, 3, 0);show_sqlist(Sqlist, len);insertElem(Sqlist, &len, 11, 0);		//在表中第11位置插入整數0DelElem(Sqlist, &len, 6);show_sqlist(Sqlist, len);printf("\nthe spare length is %d\n", MaxSize - len);return 0;
}

result:
在這里插入圖片描述

2、動態

編寫一個程序,動態的創建一個順序表。
要求:
1、順序表初始長度為10,向順序表中輸入15個整數,并打印出來
2、再刪除順序表中的第五個元素,打印出刪除后的結果

/*
編寫一個程序,動態的創建一個順序表。
要求:
1、順序表初始長度為10,向順序表中輸入15個整數,并打印出來
2、再刪除順序表中的第五個元素,打印出刪除后的結果
*/
#include "stdio.h"
#include "conio.h"
#include "malloc.h"
#include <stdlib.h>
#define MaxSize 10typedef int ElemType;	typedef struct{int *elem;		//指向順序表首地址elemint length;		//順序表中表的長度(元素個數)int listsize;	//順序表的存儲空間容量
}Sqlist;//初始化一個順序表
void initSqlist(Sqlist* L)
{L->elem = (int*)malloc(MaxSize*sizeof(ElemType));	//開辟內存,并將該段空間首地址賦值給L->elemif (!L->elem){printf("分配內存失敗");exit(0);}						//如果分配內存失敗,返回L->length = 0;										//生成一張空的順序表L->listsize = MaxSize;
}
/*
L:Sqlist類型指針
i:插入元素的位置
item:插入的元素
*/
void InsertElem(Sqlist* L, int i, ElemType item)
{//向順序表L中第i個位置插入元素itemElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1){printf("非法插入");exit(0);}	//非法插入if (L->length >= L->listsize){base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));//重新追加空間L->elem = base;		//更新內存基地址L->listsize = L->listsize + 100;		//存儲空間增大100單元}insertPtr = &(L->elem[i - 1]);		//insertPtr為插入位置for (p = &(L->elem[L->length - 1]);p >= insertPtr;p--)*(p + 1) = *p;						//將i-1以后的元素順序往后移動一個元素位置*insertPtr = item;					//在第i個位置插入元素L->length++;
}
/*
L:Sqlist類型指針
i:刪除元素的位置
*/
void DelElem(Sqlist* L, int i)
{ElemType* delItem, * q;if (i<1 || i>L->length){printf("非法刪除");exit(0);}delItem = &(L->elem[i - 1]);	//delItem指向表中第i個元素q = L->elem + L->length - 1;			//q指向表尾for (++delItem;delItem <= q;++delItem)*(delItem - 1) = *delItem;		//將第i位置以后的元素依次前移L->length--;				//表長-1
}
void print_list(Sqlist *L)
{int i = 0;for (i = 0;i < L->length;i++)printf("%d  ",L->elem[i]);
}
//測試函數
int main()
{Sqlist L;int i = 0;initSqlist(&L);for (i = 0;i < 15;i++)InsertElem(&L,i+1,i+1);     //每次在末尾插入一個元素printf("\n the content of list is \n");print_list(&L);DelElem(&L, 5);printf("\n the content of list after delete is \n");print_list(&L);_getche();return 0;
}

在這里插入圖片描述

5、順序表總結

線性表的優點:構造簡單、操作方便,通過順序表的首地址(數組名)可直接對表進行隨機存取,從而存取速度快,系統開銷小。
缺點:有可能浪費存儲空間,在插入或刪除一個元素時,需要對插入或刪除位置后面的所有元素逐個進行移動,從而導致操作效率較低。
所以順序表適用于表的長度不經常發生變化的場合,如批處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378236.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378236.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378236.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu安裝oracle unzip: No such file or directory

$ln -s /usr/bin/unzip /你的oracle11安裝目錄/install/unzip$sudo chmod 777 /usr/bin/unzip轉載于:https://www.cnblogs.com/qm4050/archive/2011/08/25/2241466.html

一、網絡爬蟲概述

1&#xff0c;瀏覽器與網絡爬蟲的區別 答&#xff1a; 對于瀏覽器而言&#xff1a;瀏覽器打開一個網站&#xff0c;會對網站服務器發送一個request請求&#xff0c;服務器收到該請求之后&#xff0c;會給瀏覽器一個respond響應&#xff0c;該響應攜帶很多數據&#xff0c;之后…

百度android廣告sdk下載,IS_Freedom

美數廣告 SDK接入流程1.嵌入廣告SDK將 sdk-android-demo/app/libs 中的 meishu-sdk_xxx_release.aar、open_ad_sdk_xxx.aar、Baidu_MobAds_SDK-release-xxx.aar、GDTSDK.unionNormal.xxx.aar、msa_mdid_1.0.13 拷貝到項目的 libs 下&#xff0c;對應的 build.gradle 文件里面添…

關于《加密與解密》的讀后感----對dump脫殼的一點思考

偶然翻了一下手機日歷&#xff0c;原來今天是夏至啊&#xff0c;時間過的真快。ISCC的比賽已經持續了2個多月了&#xff0c;我也跟著比賽的那些題目學了2個月.......雖然過程很辛苦&#xff0c;但感覺還是很幸運的&#xff0c;能在大三的時候遇到ISCC&#xff0c;不管怎樣&…

java vector_Java Vector elements()方法與示例

java vector向量類elements()方法 (Vector Class elements() method) elements() method is available in java.util package. elements()方法在java.util包中可用。 elements() method is used to get an enumeration of the elements that exist in this Vector. elements()方…

【數據結構基礎筆記】【鏈表】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、鏈表基礎2、創建一個鏈表3、插入結點4、刪除結點5、銷毀鏈表6、實例分析前言 本章總結&#xff1a;鏈表的定義、創建、銷毀&#xff0c;結點的插入與刪除 1、鏈表基礎 鏈表的物理存儲結構是用一組地址任意的存儲單元存儲…

動態添加,刪除行之心理測試系統

動態添加&#xff0c;刪除行之考試系統 數據庫設計&#xff1a; xl_option 題目選項 20090105134755404(編號) 20090105134904421(外鍵) 比較符合(選項內容) ②(選項標號) 2&#xff08;選項分值&#xff09; xl_subject 題目信息 20090105134943608&#xff08;編號&#xff…

android bitmap裁剪中間,Android裁剪中心位圖

雖然上面的大多數答案提供了一種方法來實現這一點&#xff0c;但已經有一種內置的方法來實現這一點&#xff0c;它是一行代碼(ThumbnailUtils.extractThumbnail())int dimension getSquareCropDimensionForBitmap(bitmap);bitmap ThumbnailUtils.extractThumbnail(bitmap, di…

二、request請求庫

一、requests介紹與安裝 1&#xff0c;requests介紹 答&#xff1a;requests是一個優雅且簡單的Python HTTP請求庫 2&#xff0c;requests作用 答&#xff1a;requests的作用是發送請求獲取響應數據 3&#xff0c;requests安裝 答&#xff1a;pip install requests 二、…

Java Vector Capacity()方法與示例

向量類的Capacity()方法 (Vector Class capacity() method) capacity() method is available in java.util package. Capacity()方法在java.util包中可用。 capacity() method is used to return the current capacity (i.e. initially, how many object exists) of this Vecto…

MFC和GTK的區別

關鍵技術 http://blog.csdn.net/master_max/article/details/1540204 MFC和GTK的區別&#xff1f;&#xff1f; 1.  兩者都是基于面向對象設計的。盡管MFC是用C寫的&#xff0c;而GTK是用C寫的&#xff0c;但思想都是面向對象的。GTK使用glib的對象機制&#xff0c;由于用C寫…

視頻圖像質量評價

目錄1、人眼視覺特性1、眼的適應性2、對比靈敏度3、空間分辨率和時間分辨率4、馬赫效應5、可見度閾值2、圖像質量測度3、圖像評價方法4、圖像評價方法的優劣1、人眼視覺特性 1、眼的適應性 暗適應性&#xff1a;從亮環境到暗環境&#xff0c;適應暗環境的特性 亮適應性&#…

鴻蒙科技與文化,數字閱讀 | “華為鴻蒙”:當現代科技遇到古典文化

華為事件愈演愈烈。海思芯片 20 年 " 備胎 " 終轉正&#xff0c;那么操作系統呢&#xff1f;最近&#xff0c;華為為自主研發的操作系統注冊商標—— " 鴻蒙 "&#xff0c;引發了關于華為注冊整本《山海經》的熱烈討論&#xff0c;很多人的朋友圈&#xff…

三、Beautiful Soup解析庫

一、Beautiful Soup介紹與安裝 1&#xff0c;Beautiful Soup介紹 答&#xff1a;Beautiful Soup是一個可以從HTML或XML文件中提取數據的Python庫 2&#xff0c;Beautiful Soup安裝 答&#xff1a;安裝Beautiful Soup 4&#xff1a;pip install bs4 安裝lxml&#xff1a;pip…

strictmath_Java StrictMath sqrt()方法與示例

strictmathStrictMath類sqrt()方法 (StrictMath Class sqrt() method) sqrt() Method is available in java.lang package. sqrt()方法在java.lang包中可用。 sqrt() Method is used to find the square root of the given parameter in the method. Here, "sqrt" st…

recovery編譯問題匯總

1、修改支持USB大容量存儲 &#xff08;1&#xff09;、首先需要查看手機lun位置 手機鏈接電腦&#xff0c;打開cmd命令行&#xff0c;依次輸入以下命令: adb shell find /sys -name "lun" 輸出以下結果&#xff1a; 發現手機輸出結果有兩個&#xff0c;需要進一步查…

言語理解每日學習及精解20110831

【例題】天氣預報一般要考慮氣溫、氣壓、溫度、風力等因素&#xff0c;這些都是大氣層本身變化的結果&#xff0c;只要掌握這些因素&#xff0c;通過計算機的計算就能準確地預報天氣變化的趨勢。沙塵暴作為一種特殊的天氣現象&#xff0c;同樣要考慮上述氣象因素。據氣象學家分…

【數據結構基礎筆記】【棧】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、棧的定義2、創建一個棧3、入棧和出棧操作4、棧的清空、銷毀、計算棧的當前容量5、實例分析前言 本章總結&#xff1a;棧的定義、創建棧&#xff0c;銷毀棧&#xff0c;入棧出棧操作等操作。 1、棧的定義 棧是一種重要的…

四、正則表達式

一、正則表達式的概念和作用 正則表達式概念&#xff1a;一種字符串匹配的模式 正則表達式作用&#xff1a; 可以檢查一個字符串中是否包含某種字串替換匹配的字串提取某個字符串中匹配的字串 二、正則表達式中常見的語法 字符描述原樣字符匹配字符一般字符匹配自身beyondb…

用HTML語言制作list標記,html5 datalist標簽的用法是什么?這里有datalist標簽的用法實例...

本篇文章主要為大家講述了關于html5 datalist標簽的用法及html5 datalist標簽的用法實例。本文說了兩個常用的選項框的實例供大家選擇觀看&#xff0c;下面就讓我們一起來看這篇文章吧我們先來看看html5 datalist標簽的用法&#xff1a;標簽定義選項列表。請與input元素配合使用…