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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构基础应用】【顺序表】

發(fā)布時間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构基础应用】【顺序表】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

文章目錄

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


前言

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


1、合并兩個順序表

題目要求:

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

提示:應(yīng)該使用動態(tài)創(chuàng)建這個順序表,這樣list3的長度才可以根據(jù)list1和list2的長度動態(tài)調(diào)整。
要實現(xiàn)兩個順序按值歸并,最終仍保持數(shù)據(jù)的從小到大遞增排序,可以設(shè)置兩個指針p1、p2分別指向兩個待合并的順序表list1和list2,設(shè)置指針p3指向新表list3用來向list3中存放數(shù)據(jù),然后逐一比較p1和p2指向的內(nèi)容 ,將其中較小的那個放到p3指向的list3的存儲單元,然后將較小的那個指針+1.使其指向表的下一個數(shù)據(jù),同時p3也要自動+1。重復(fù)上述操作,直到list1,list2中某一個順序表的內(nèi)容被全部歸并到list3中.最后再將未完全歸并的順序表中的后續(xù)內(nèi)容整體移至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); //在堆內(nèi)存上開辟空間,并將地址指針傳給elemif (!L->elem){printf("順序表內(nèi)存開辟失敗");exit(0);}L->length = 0; //最開始的表長0L->listsize = size; }//向順序表中插入元素 //向順序表L第i個位置插入元素item void InsertElem(Sqlist* L,int i, ElemType item) {//追加內(nèi)存后的新的基址、指向插入位置的指針、移動數(shù)據(jù)的指針中間變量ElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1) {printf("非法插入");exit(0);}if (L->length >= L->listsize) //順序表的空間不夠,追加內(nèi)存{base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType)); //將追加內(nèi)容后的內(nèi)存首地址傳給baseL->elem = base;L->listsize = L->listsize + 100;}insertPtr = &(L->elem[i-1]); //指針指向插入位置for (p = &L->elem[L->length - 1];p >= insertPtr;p--){//移動順序表中數(shù)據(jù)*(p+1) = *p;}*insertPtr = item; //插入數(shù)據(jù)元素L->length++; } //銷毀順序表 void DestroySqlist(Sqlist* list) {int* p = list->elem;free(p);list->elem = NULL;list->length = 0;list->listsize = 0; } //兩個順序表內(nèi)容的合并,返回一個新的list Sqlist MergeList(Sqlist list1, Sqlist list2) {//將list1和list2的內(nèi)容合并到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的表尾//實現(xiàn)合并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("輸出合并后的結(jié)果\n");for (i = 0;i < list3.length;i++){printf("%d ",list3.elem[i]); //這里%d根據(jù)ElemType類型來進行修改}//銷毀list,釋放內(nèi)存DestroySqlist(&list1);DestroySqlist(&list2);DestroySqlist(&list3);_getche();return 0; }

效果:

總結(jié)

以上是生活随笔為你收集整理的【数据结构基础应用】【顺序表】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。