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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

文章目錄

  • 前言
    • 1、合并兩個(gè)順序表


前言

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


1、合并兩個(gè)順序表

題目要求:

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

提示:應(yīng)該使用動(dòng)態(tài)創(chuàng)建這個(gè)順序表,這樣list3的長(zhǎng)度才可以根據(jù)list1和list2的長(zhǎng)度動(dòng)態(tài)調(diào)整。
要實(shí)現(xiàn)兩個(gè)順序按值歸并,最終仍保持?jǐn)?shù)據(jù)的從小到大遞增排序,可以設(shè)置兩個(gè)指針p1、p2分別指向兩個(gè)待合并的順序表list1和list2,設(shè)置指針p3指向新表list3用來(lái)向list3中存放數(shù)據(jù),然后逐一比較p1和p2指向的內(nèi)容 ,將其中較小的那個(gè)放到p3指向的list3的存儲(chǔ)單元,然后將較小的那個(gè)指針+1.使其指向表的下一個(gè)數(shù)據(jù),同時(shí)p3也要自動(dòng)+1。重復(fù)上述操作,直到list1,list2中某一個(gè)順序表的內(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)存上開(kāi)辟空間,并將地址指針傳給elemif (!L->elem){printf("順序表內(nèi)存開(kāi)辟失敗");exit(0);}L->length = 0; //最開(kāi)始的表長(zhǎng)0L->listsize = size; }//向順序表中插入元素 //向順序表L第i個(gè)位置插入元素item void InsertElem(Sqlist* L,int i, ElemType item) {//追加內(nèi)存后的新的基址、指向插入位置的指針、移動(dòng)數(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--){//移動(dòng)順序表中數(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; } //兩個(gè)順序表內(nèi)容的合并,返回一個(gè)新的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第一個(gè)元素p2 = list2.elem; //p2指向list2第一個(gè)元素//初始化list3,其長(zhǎng)度為list1 list2 長(zhǎng)度之和InitSqlist(&list3,list1.length+list2.length);p3 = list3.elem; //p3指向list3第一個(gè)元素p1_last = list1.length + list1.elem - 1; //p1_last指向list1的表尾p2_last = list2.length + list2.elem - 1; //p2_last指向list2的表尾//實(shí)現(xiàn)合并while (p1<=p1_last && p2<=p2_last) //當(dāng)list1與list2中有一個(gè)list被遍歷完{if (*p1 <= *p2) //當(dāng)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++;}}//當(dāng)搬移完成后,返回list3return list3; } //測(cè)試程序 int main() {Sqlist list1, list2, list3; //實(shí)例化3個(gè)順序表int n, i; //存放list長(zhǎng)度中間變量、累加器ElemType e; //插入元素中間變量printf("請(qǐng)輸入list1的長(zhǎng)度\n");scanf("%d",&n);InitSqlist(&list1,n);printf("請(qǐng)輸入list1的元素\n");for (i=1;i<=n;i++){scanf("%d",&e);InsertElem(&list1,i,e);}printf("請(qǐng)輸入list2的長(zhǎng)度\n");scanf("%d", &n);InitSqlist(&list2, n);printf("請(qǐng)輸入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類型來(lái)進(jìn)行修改}//銷毀list,釋放內(nèi)存DestroySqlist(&list1);DestroySqlist(&list2);DestroySqlist(&list3);_getche();return 0; }

效果:

總結(jié)

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

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