【數據結構基礎應用】【順序表】

代碼參考《妙趣橫生的算法.C語言實現》、《劍指OFFER 名企面試官精講典型編程題 第2版》等

文章目錄

  • 前言
    • 1、合并兩個順序表


前言

本章總結在看書過程中的一些關于順序表的算法題并可能含有一些自己的一些疑問。題目數量不定,隨閱歷增加而增加;


1、合并兩個順序表

題目要求:

有兩個順序存儲的線性表,分別存放了一些整數數據,每個順序表中存放的數據從小到大排列。寫一個程序,將兩個表合并,生成一個新的順序表,里面的順序仍然按照從小到大排列。
例如:
list1:1,2,4,8,10
list2:3,9,11
合并之后的list3:1,2,3,4,8,9,10,11

提示:應該使用動態創建這個順序表,這樣list3的長度才可以根據list1和list2的長度動態調整。
要實現兩個順序按值歸并,最終仍保持數據的從小到大遞增排序,可以設置兩個指針p1、p2分別指向兩個待合并的順序表list1和list2,設置指針p3指向新表list3用來向list3中存放數據,然后逐一比較p1和p2指向的內容 ,將其中較小的那個放到p3指向的list3的存儲單元,然后將較小的那個指針+1.使其指向表的下一個數據,同時p3也要自動+1。重復上述操作,直到list1,list2中某一個順序表的內容被全部歸并到list3中.最后再將未完全歸并的順序表中的后續內容整體移至list3中。

代碼:

#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "conio.h"
typedef int ElemType;typedef struct {int* elem;int length;int listsize;
}Sqlist;//初始化順序表
void InitSqlist(Sqlist *L,int size)
{L->elem = (int*)malloc(sizeof(ElemType)*size);			//在堆內存上開辟空間,并將地址指針傳給elemif (!L->elem){printf("順序表內存開辟失敗");exit(0);}L->length = 0;								//最開始的表長0L->listsize = size;
}//向順序表中插入元素
//向順序表L第i個位置插入元素item
void InsertElem(Sqlist* L,int i, ElemType item)
{//追加內存后的新的基址、指向插入位置的指針、移動數據的指針中間變量ElemType* 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));		//將追加內容后的內存首地址傳給baseL->elem = base;L->listsize = L->listsize + 100;}insertPtr = &(L->elem[i-1]);		//指針指向插入位置for (p = &L->elem[L->length - 1];p >= insertPtr;p--){//移動順序表中數據*(p+1) = *p;}*insertPtr = item;				//插入數據元素L->length++;
}
//銷毀順序表
void DestroySqlist(Sqlist* list)
{int* p = list->elem;free(p);list->elem = NULL;list->length = 0;list->listsize = 0;
}
//兩個順序表內容的合并,返回一個新的list
Sqlist MergeList(Sqlist list1, Sqlist list2)
{//將list1和list2的內容合并到list3并返回int* p1, * p2, * p3, * p1_last, * p2_last;Sqlist list3;p1 = list1.elem;		//p1指向list1第一個元素p2 = list2.elem;		//p2指向list2第一個元素//初始化list3,其長度為list1 list2 長度之和InitSqlist(&list3,list1.length+list2.length);p3 = list3.elem;		//p3指向list3第一個元素p1_last = list1.length + list1.elem - 1;	//p1_last指向list1的表尾p2_last = list2.length + list2.elem - 1;	//p2_last指向list2的表尾//實現合并while (p1<=p1_last && p2<=p2_last)		//當list1與list2中有一個list被遍歷完{if (*p1 <= *p2)	//當p1指向的元素小于p2指向的元素{*p3 = *p1;p3++;p1++;}else{*p3 = *p2;p3++;p2++;}list3.length++;}//將list1或者list2中剩余元素并入list3中if (p1 <= p1_last)		//p1有剩余{while (p1 <= p1_last){*p3 = *p1;p3++;p1++;list3.length++;}}else{while (p2 <= p2_last){*p3 = *p2;p3++;p2++;list3.length++;}}//當搬移完成后,返回list3return list3;
}
//測試程序
int main()
{Sqlist list1, list2, list3;		//實例化3個順序表int n, i;					//存放list長度中間變量、累加器ElemType e;					//插入元素中間變量printf("請輸入list1的長度\n");scanf("%d",&n);InitSqlist(&list1,n);printf("請輸入list1的元素\n");for (i=1;i<=n;i++){scanf("%d",&e);InsertElem(&list1,i,e);}printf("請輸入list2的長度\n");scanf("%d", &n);InitSqlist(&list2, n);printf("請輸入list2的元素\n");for (i = 1;i <= n;i++){scanf("%d", &e);InsertElem(&list2, i, e);}list3 = MergeList(list1,list2);printf("輸出合并后的結果\n");for (i = 0;i < list3.length;i++){printf("%d ",list3.elem[i]);			//這里%d根據ElemType類型來進行修改}//銷毀list,釋放內存DestroySqlist(&list1);DestroySqlist(&list2);DestroySqlist(&list3);_getche();return 0;
}

效果:
在這里插入圖片描述

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

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

相關文章

html上下滾動切換頂端tab,jQuery實現Tab菜單滾動切換的方法

本文實例講述了jQuery實現Tab菜單滾動切換的方法。分享給大家供大家參考。具體如下&#xff1a;這是一款jQuery實現讓你的Tab菜單滾動的代碼,先運行一下看看效果咋樣?是不是超不錯,讓你的網頁變得靈動起來,不再靜止,學習jquery的朋友也可作為范例來參考吧.運行效果截圖如下&am…

[轉載]十四步實現擁有強大AI的五子棋游戲

又是本人一份人工智能作業……首先道歉&#xff0c;從Word貼到Livewrter&#xff0c;好多格式沒了&#xff0c;也沒做代碼高亮……大家湊活著看……想做個好的人機對弈的五子棋&#xff0c;可以說需要考慮的問題還是很多的&#xff0c;我們將制作擁有強大AI五子棋的過程分為十四…

Java BigDecimal plus()方法與示例

BigDecimal Class plus()方法 (BigDecimal Class plus() method) Syntax: 句法&#xff1a; public BigDecimal plus();public BigDecimal plus(MathContext ma_co);plus() method is available in java.math package. plus()方法在java.math包中可用。 plus() method is used…

爬蟲項目(二)---采集從03月02號以來的世界各國疫情數據

該內容出自黑馬程序員教程 采集從03月02號以來的世界各國疫情數據 步驟&#xff1a; Ⅰ&#xff0c;重構項目(一)的代碼&#xff0c;以提高擴展性 把功能封裝到一個類中每一個小功能變成一個方法通過run方法啟動爬蟲 import requests import re import json from bs4 impor…

【原創】StreamInsight查詢系列(二十)——查詢模式之檢測間隙事件

上篇文章介紹了查詢模式中如何檢測異常事件&#xff0c;這篇博文將介紹StreamInsight中如何檢測間隙事件。 測試數據準備 為了方便測試查詢&#xff0c;我們首先準備一個靜態的測試數據源&#xff1a;// 創建數據源&#xff0c;要注意的是4:16和4:30之間存在的事件間隙 var sou…

git 項目過大問題解決

當項目過大時&#xff0c;git clone時會出現error: RPC failed; HTTP curl The requested URL returned error: Gateway Time-out的問題 解決方法很簡單&#xff0c;在git clone時加上--depth1即可解決 克隆的項目只包含最近的一次commit的一個分支&#xff0c;體積很小&#x…

java bitset_Java BitSet hashCode()方法及示例

java bitsetBitSet類hashCode()方法 (BitSet Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to retrieve hash code for this bit set (BitSet). hashCode()方法用于檢索此位…

【數據結構基礎應用】【查找和排序算法】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、順序查找2、折半查找3、直接插入排序4、選擇排序5、冒泡排序6、希爾排序7、快速排序8、堆排序9、排序算法性能比較10、所有算法的code&#xff08;C語言&#xff09;前言 本章總結查找和排序算法&#xff1a;順序查找、折…

MarshalHelper

1 public class MarshalHelper2 {3 /// <summary>4 /// 結構體轉byte數組5 /// </summary>6 /// <param name”structObj”>要轉換的結構體</param>7 /// <returns>轉換后的byte數組</returns&g…

深入淺出SharePoint——InvokeWorkflow的妙用

應用場景&#xff1a;在Parallel Activity中使用InvokeWorkflow來達到間接關閉并行分支的功能。 TestInvokeWorkflow方法用于啟動監聽工作流。endinvoke方法用戶關閉啟動的監聽工作流實例。 private void TestInvokeWorkflow(object sender, EventArgs e) { SPWeb web SPConte…

爬蟲項目(三)---采集最近一日全國各省疫情數據

該內容出自黑馬程序員教程 采集最近一日全國各省疫情數據 當然&#xff0c;數據來源仍然是丁香園新型冠狀病毒肺炎疫情實時動態首頁 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先確定全國各省疫情數據的位置 全國各省份的疫情數據…

計算機專業博士后排名,排名丨計算機專業領域TOP10,性價比超高!

原標題&#xff1a;排名丨計算機專業領域TOP10&#xff0c;性價比超高&#xff01;相信各位家長、同學已經看過太多專業的排名&#xff0c;我問過很多理科生將來想學什么專業&#xff0c;聽到頻率最高的還是計算機專業。似乎大家都知道&#xff0c;學計算機是比較掙錢的&#x…

python set |_Python事件類| set()方法與示例

python set |Python Event.set()方法 (Python Event.set() Method) set() is an inbuilt method of the Event class of the threading module in Python. set()是Python中線程模塊的Event類的內置方法。 When the set() method is called, the internal flag of that event c…

js 命名規范

轉載于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬蟲項目(四)---采集從01月22日以來全國各省疫情數據

采集從03月02日以來全國各省疫情數據 當然&#xff0c;數據來源仍然是丁香園新型冠狀病毒肺炎疫情實時動態首頁 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 確定01月22日以來全國各省疫情數據的URL 由項目(三)可以獲取全國各省疫情數據點擊可下載&…

Install PHP and Apache

http://cn.php.net/manual/en/install.unix.apache2.php Install Apache first, then sudo apt-get install libxml2-dev sudo apt-get install libmysqlclient16-dev Then, configure PHP轉載于:https://www.cnblogs.com/songsiyao/archive/2011/09/15/2178087.html

糾錯碼trick和數據壓縮trick

糾錯碼和壓縮算法是同一枚硬幣的兩面。 兩者都來自于對冗余的想法。 糾錯碼被視為向消息或文件中添加冗余的原則性方法。而壓縮算法正好相反&#xff0c;他們會從消息或文件中移除冗余。 壓縮和糾錯并不是彼此抵消的&#xff0c;相反&#xff0c;好的壓縮算法會移除抵消冗余&am…

計算機專業理論,計算機專業綜合理論.doc

計算機專業綜合理論2010年南京市單招班教學調研測試卷(二)計算機專業綜合理論命題人&#xff1a;管榮平 陳高峰 戴則萍 吳有俊本試卷分第一卷(單項選擇題、判斷題)和第二卷(填空題、程序閱讀題、編程題和計算作圖題)兩部分。第一卷1至2頁&#xff0c;第二卷3至6頁。兩卷滿分300…

網站上flv,MP4等格式的視頻文件播放不出來的解決辦法

在做一個網站時&#xff0c;發現視頻文件&#xff0c;比如flv&#xff0c;MP4格式在本地可以正常的播放&#xff0c;但是傳到了開發機器上&#xff0c;就不行了。播放器的文件地址是對的&#xff0c;就是一直沒有反應。 經過長時間的實驗&#xff0c;發現問題在與iis的設置問題…

centos6 更新數據源

嘗試了很多,還是163源最舒服. 編輯yum配置文件(163源)&#xff1a; #vi /etc/yum.repos.d/CentOS-Base.repo [base] nameCentOS-$releasever - Base mirrorlisthttp://mirrorlist.centos.org/?release$releasever&arch$basearch&repoos #baseurlhttp://mirror.centos…