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...