資料結構與演算法——有序連結串列合併
要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
/*
尾部插入結點
*/
void Attach(ElementType x,List* rear){
List temp;
temp = (List)malloc(sizeof(struct Node));
temp->Data = x;
temp->Next = NULL;
(*rear)->Next = temp;
*rear = temp;
}
/*
讀入連結串列
*/
List Read(){
int n,x;
List L,rear,temp;
L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
rear = L;
//輸入連結串列結點的個數
scanf("%d" ,&n);
while(n--){
scanf("%d",&x);
Attach(x,&rear);
}
return L;
}
/*
列印連結串列
*/
void Print(List L){
if(!L->Next){
printf("NULL\n");
return ;
}
List p = L->Next;
while(p){
printf("%d ",p->Data);
p = p-> Next;
}
printf("\n");
}
/*
比較數值大小
*/
int Compare(int a,int b){
if(a>b){
return 1;
}
if(a<b){
return -1;
}
if(a == b){
return 0;
}
}
/*
合併連結串列
*/
List Merge( List L1, List L2 ){
List L,rear,temp,p1,p2;
L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
rear = L;
p1 = L1->Next;
p2 = L2->Next;
while(p1 && p2){
switch(Compare(p1->Data,p2->Data)){
case 1:{
rear->Next = p2;
rear = p2;
p2 = p2->Next;
break;
}
case -1:{
rear->Next = p1;
rear = p1;
p1 = p1->Next;
break;
}
case 0:{
rear->Next = p1;
rear = p1;
p1 = p1->Next;
temp = p2;
p2 = p2->Next;
free(temp);
break;
}
default:{
break;
}
}
}
if(p1){
rear->Next = p1;
}
if(p2){
rear->Next = p2;
}
L1->Next = NULL;
L2->Next = NULL;
return L;
}
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
相關推薦
資料結構與演算法——有序連結串列合併
要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。 #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef str
java版資料結構與演算法—有序連結串列
package com.zoujc.sortLink; /** * 有序連結串列 */ class Link { public int dData; public Link next; public Link(int dd){ dData = d
資料結構與演算法之連結串列篇(上)
連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。
資料結構與演算法之連結串列篇(下)
Q:如何輕鬆寫出正確的連結串列程式碼? 總結起來,就是投入時間+技巧; 一、投入時間: 只要願意投入時間,大多數人都是可以學會的,比如說,如果你真能花上一個週末或者一整天時間,就去寫連結
【資料結構與演算法】連結串列——遞增排序
今天看書時偶然想到的問題,書上是要求將一個數據插入一個有序連結的線性連結串列中, 所以我想先進行連結串列內的資料排序在進行插入資料。 在這裡我只寫了排序的函式。 函式實現: void Sort(LinkList&list, int &n) { f
[一步步學資料結構與演算法 07]-連結串列(下)
一、理解指標或引用的含義 1.含義:將某個變數(物件)賦值給指標(引用),實際上就是就是將這個變數(物件)的地址賦值給指標(引用)。 2.示例: p—>next = q; //表示p節點的後繼指標儲存了q節點的記憶體地址。 p—>next = p—&
資料結構與演算法----雙向連結串列
PS:前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入一個指標,前一個的指標指向後一個結點的地址,那麼還有一種形式就是雙向連結串列,裡面又加上了一個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。 /** * 建立結構體 * */ typedef
【python資料結構與演算法】連結串列——連結串列中環的入口節點、兩個連結串列的第一個公共節點(相交連結串列)
如題,這類問題在LeetCode上和劍指offer上總共有這些涉及: LeetCode:141,142,160 劍指offer:兩個連結串列的第一個公共節點(預設是無環單鏈表)、連結串列中環的入口節點 補充:兩個未知是否有環的單鏈表第一個公共節點 我直接敘述第三個問題,
資料結構與演算法之連結串列
連結串列的分類:(1)單鏈表頭插法:只需要維護一個頭結點即可,常用來模擬堆疊;尾插法:需要維護頭結點和尾結點,常用來模擬佇列。(2)雙向連結串列雙向遍歷,可以用來儲存網頁的歷史記錄等;(3)迴圈連結串列經常出現在面試題中,判斷連結串列是否有環。連結串列的刪除方式一:維
js資料結構與演算法--雙向連結串列的實現
雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料節點中都有兩個指標,分別指向直接後繼和直接前驅。所以,雙向連結串列中的任意一個節點開始,都可以很方便的訪問它的前驅節點和後繼節點。 雙向連結串列的實現 linkednode.js ,裡面使用了類的繼承extends,使用了super函式。 /**
『資料結構與演算法』連結串列(單鏈表、雙鏈表、環形連結串列)
> 微信搜尋:碼農StayUp > 主頁地址:[https://gozhuyinglong.github.io](https://gozhuyinglong.github.io/) > 原始碼分享:[https://github.com/gozhuyinglong/blog-demos](h
【資料結構與演算法】——連結串列(Linked List)
## 連結串列(Linked List)介紹 > 連結串列是有序的列表,但是它在記憶體中是儲存如下: > > ![](http://itfxsen.oss-cn-chengdu.aliyuncs.com/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%
資料結構與演算法(二)合併兩個有序連結串列
附上部落格連結,歡迎大家前來交流學習 本系列的第一節概括性地簡單介紹了一下資料結構和演算法的概念,說實話有點虛,因為誰都知道連結串列和陣列是什麼,也都能說出雜湊和二叉樹,但真正有難度的是,在實際開發中如何去用這些資料結構,根據不同的開發需求選擇不同的資料結構和
資料結構與演算法解題:合併兩個有序連結串列
資料結構和演算法,是程式設計的基礎,想要提高程式設計能力,這是繞不開的坎,為了練習演算法,在Codewars和LeetCode上刷了一些難度級別為easy的題,程式碼都儲存成py檔案了,時間久了,積累的多了,有些亂,接下了打算逐步把它們搬到部落格上來,整理一下,便於查詢複習。廢話少說,開
《資料結構與演算法》之連結串列—有序連結串列
2、有序連結串列 有序連結串列是在單鏈表的基礎上對單鏈表的表頭節點插入進行修改,從表頭開始根據插入值與連結串列中原先存在的資料節點進行比較判斷,若大於(或小於)該節點就向後移一個節點進行比較,直至不大於(或小於)該節點,最終實現按照從小到大(或從大到小)的順序排列連結串列。 // 插入節點,
雙向連結串列簡單實現--資料結構與演算法紀錄片第一記
從這個月開始得準備春招的東西,所以打算重新學習資料結構與演算法,以後的部落格就以這個為主。 今天是線性結構中的雙向連結串列。 程式碼實現與測試: DoubleLinkNode: package linear.doublelink;/** * @Description: 連結串列節點結
為什麼我要放棄javaScript資料結構與演算法(第五章)—— 連結串列
這一章你將會學會如何實現和使用連結串列這種動態的資料結構,這意味著我們可以從中任意新增或移除項,它會按需進行擴張。 本章內容 連結串列資料結構 向連結串列新增元素 從連結串列移除元素 使用 LinkedList 類 雙向連結串列 迴圈連結串列 第五章 連結串列 連結串列資
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-迴圈連結串列)
迴圈連結串列 迴圈連結串列同單鏈表,只需設定head.next = head就可以實現迴圈連結串列 其它方法不變,但是遍歷方法需要改一下 function display() { var cur = this.head; var str = ''; //如果不設定
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-雙向連結串列)
雙向連結串列 雙向連結串列的 remove() 方法比單向連結串列的效率更高,因為不需要再查詢前驅節點了 //建立建構函式建立節點 function Node(element){ this.element = element; this.next = null; th
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-單鏈表)
單鏈表 //建立建構函式建立節點 function Node(element){ this.element = element; this.next = null; } //連結串列的建構函式 function LList(){ this.head = new Node