資料結構 有序鍊錶的合併

2021-09-24 00:04:32 字數 4101 閱讀 7113

1:已知兩個鍊錶head1和head2各自有序,請把它們合併成乙個鍊錶,依然有序。使用非遞迴方法以及遞迴方法。

2:首先介紹非遞迴方法。區域性引用方法:這種方法避免使用虛擬節點(dummy node),而是使用乙個指向指標的指標,struct node** lastptrref,這個指標指向結果鍊錶的最後乙個節點。在這個方法中,所有由虛擬節點完成的工作都有lastptrref完成。**如下:

//#include "stdafx.h"

#include #include #include using namespace std;

typedef struct node//定義鍊錶結構體

node;

node *create()//建立單鏈表

else

q->next = null;/*尾結點的後繼指標為null(空)*/

}return head;

}int length(node *head)

return len;

}void print(node *head)

}node *search_node(node *head, int pos)//查詢單鏈表pos位置的節點,返回節點的指標。pos從0開始,0返回head節點

if (pos == 0)

if (pos == null)

while (--pos)

}return p;

}node *insert_node(node *head, int pos, int data)//單鏈表的插入

p = search_node(head, pos);//獲得pos的節點指標

if (p != null)

return head;

}node *delete_node(node *head, int pos)//刪除節點

p = search_node(head, pos - 1);//獲得位置pos節點的指標

if (p != null&&p->next != null)

return head;

}node *reverse(node *head)//鍊錶的逆置

return prev;

}node *search(node *head)//尋找單鏈表的中間元素

i++;

current = current->next;

}return middle;

}node *insertsort(void)//單鏈表的正向排序

new = (struct node*)malloc(sizeof(struct node));

new->data = data;

new->next = null;

if (head == null)//第一次迴圈時對頭節點賦值

if (new->data <= head->data)

cur = head;

while (new->data > cur->data && cur->next != null)//找到需要插入的位置

if (cur->data >= new->data)//位置在中間

else//位置在末尾

cur->next = new;//把new節點插到cur之後

}return head;

}bool isloop(node *head, node **start)//判斷鍊錶是否存在環形鍊錶,start為回環開始節點的位址

dowhile (p2 && p2->next && p1 != p2);

if (p1 == p2)

else

}void movenode(struct node** destref, struct node** sourceref)//用於區域性引用方法合併有序鍊錶

struct node* sortedmerge(struct node* a, struct node* b)//區域性引用方法合併有序鍊錶

else if (b == null)

if (a->data <= b->data)

else

/*tricky:advance to point to the next ".next" field */

lastptrref = &((*lastptrref)->next);

}return (result);

}int main()

view code

執行結果:

3:遞迴方法如下:

//#include "stdafx.h"

#include #include using namespace std;

typedef struct node//定義鍊錶結構體

node;

node *create()//建立單鏈表

else

q->next = null;/*尾結點的後繼指標為null(空)*/

}return head;

}int length(node *head)

return len;

}void print(node *head)

}node *search_node(node *head, int pos)//查詢單鏈表pos位置的節點,返回節點的指標。pos從0開始,0返回head節點

if (pos == 0)

if (pos == null)

while (--pos)

}return p;

}node *insert_node(node *head, int pos, int data)//單鏈表的插入

p = search_node(head, pos);//獲得pos的節點指標

if (p != null)

return head;

}node *delete_node(node *head, int pos)//刪除節點

p = search_node(head, pos - 1);//獲得位置pos節點的指標

if (p != null&&p->next != null)

return head;

}node *reverse(node *head)//鍊錶的逆置

return prev;

}node *search(node *head)//尋找單鏈表的中間元素

i++;

current = current->next;

}return middle;

}node *insertsort(void)//單鏈表的正向排序

new = (struct node*)malloc(sizeof(struct node));

new->data = data;

new->next = null;

if (head == null)//第一次迴圈時對頭節點賦值

if (new->data <= head->data)

cur = head;

while (new->data > cur->data && cur->next != null)//找到需要插入的位置

if (cur->data >= new->data)//位置在中間

else//位置在末尾

cur->next = new;//把new節點插到cur之後

}return head;

}bool isloop(node *head, node **start)//判斷鍊錶是否存在環形鍊錶,start為回環開始節點的位址

dowhile (p2 && p2->next && p1 != p2);

if (p1 == p2)

else

}struct node* sortedmerge(struct node* a, struct node* b)//將兩個鍊錶合併,遞迴法

else

return (result);

}int main()

view code

執行結果:

收藏

資料結構 合併兩個有序鍊錶,合併後依然有序

解題思路 假設有兩個有序單鏈表list1 list2 首先建立新的空鍊錶,用於存放結果 如果兩個有序單鏈表均為空,結果鍊錶為空 如果有乙個有序單鏈表為空,則結果鍊錶為另乙個鍊錶 如果兩個有序單鏈表均不為空,則根據以下方法進行合併 合併結束的條件 兩個鍊錶有乙個為空 合併兩個有序鍊錶,合併後依然有序 ...

資料結構 有序鍊錶合併(C語言版)

有序鍊錶合併 兩個有序的鍊錶,要求將其合併為乙個鍊錶,並且該鍊錶保持有序!這裡所講的是鍊錶公升序!首先,我們要構造兩張按照公升序排列好的鍊錶。構造鍊錶 我們的方法有尾插,頭插,大家可以click鏈結來檢視 這裡我們的實驗資料,以及思路如圖所示!實驗資料 鍊錶1 1,3,5,7 鍊錶2 1,2,4 5...

資料結構例程 合併有序表

本文針對資料結構基礎系列網路課程 2 線性表中第15課時有序表。問題 有兩個有序表la和lb,將它們合併成乙個有序表lc。要求不破壞原有表la和lb 演算法思想 解法1 用順序表實現 支援的演算法庫,及list.件,鏈結 include list.h void unionlist sqlist la...