實驗報告4(使用順序表和單鏈表,進(jìn)行有序表的合并)
一、實驗?zāi)康模?/strong>
熟練使用順序表和單鏈表,進(jìn)行有序表的合并。
二、實驗儀器或設(shè)備:
操作系統(tǒng):Windows11
編程環(huán)境:Dev-cpp 5.11
三、算法總體設(shè)計
(一)使用單鏈表進(jìn)行有序表的合并
1. 打印鏈表
2. 合并兩個有序鏈表
3. 釋放鏈表內(nèi)存
(二)使用順序表進(jìn)行有序表的合并
1.利用順序表合并有序表
2. 釋放合并后數(shù)組的內(nèi)存
四、實驗步驟(包括主要步驟、命令分析等)
(一)使用單鏈表進(jìn)行有序表的合并
1 #include <iostream> 2 using namespace std; 3 // 單鏈表節(jié)點定義 4 struct ListNode { 5 int val; 6 ListNode* next; 7 ListNode(int x) : val(x), next(NULL) {} 8 }; 9 // 打印鏈表 10 void printList(ListNode* head) { 11 ListNode* current = head; 12 while (current != NULL) { 13 cout << current->val << " "; 14 current = current->next; 15 } 16 cout << endl; 17 } 18 // 合并兩個有序鏈表 19 ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) { 20 // 創(chuàng)建一個啞節(jié)點作為新鏈表的頭部 21 ListNode dummy(0); 22 ListNode* tail = &dummy; 23 while (l1 != NULL && l2 != NULL) { 24 if (l1->val <= l2->val) { 25 tail->next = l1; 26 l1 = l1->next; 27 } else { 28 tail->next = l2; 29 l2 = l2->next; 30 } 31 tail = tail->next; 32 } 33 // 添加剩余節(jié)點 34 tail->next = (l1 != NULL) ? l1 : l2; 35 return dummy.next; 36 } 37 // 創(chuàng)建鏈表 38 ListNode* createList(int* values, int size) { 39 if (size == 0) return NULL; 40 ListNode* head = new ListNode(values[0]); 41 ListNode* current = head; 42 for (int i = 1; i < size; ++i) { 43 current->next = new ListNode(values[i]); 44 current = current->next; 45 } 46 return head; 47 } 48 // 釋放鏈表內(nèi)存 49 void freeList(ListNode* head) { 50 ListNode* current = head; 51 while (current != NULL) { 52 ListNode* next = current->next; 53 delete current; 54 current = next; 55 } 56 } 57 int main() { 58 // 創(chuàng)建第一個有序鏈表 59 int arr1[] = {1, 3, 5, 7}; 60 ListNode* list1 = createList(arr1, 4); 61 // 創(chuàng)建第二個有序鏈表 62 int arr2[] = {2, 4, 6, 8}; 63 ListNode* list2 = createList(arr2, 4); 64 // 合并兩個有序鏈表 65 ListNode* mergedList = mergeSortedLists(list1, list2); 66 // 打印合并后的鏈表 67 cout << "合并后的鏈表: "; 68 printList(mergedList); 69 freeList(mergedList); // 合并后的鏈表 70 return 0; 71 }
(二)使用順序表進(jìn)行有序表的合并
1 #include <cstdlib> 2 #include <iostream> 3 using namespace std; 4 int* mergeSortedArrays(int* arr1, int size1, int* arr2, int size2) { 5 int totalSize = size1 + size2; 6 int* mergedArray = (int*)std::malloc(totalSize * sizeof(int)); // 動態(tài)分配內(nèi)存 7 if (!mergedArray) { 8 // 處理內(nèi)存分配失敗的情況 9 cerr << "Memory allocation failed" << endl; 10 exit(EXIT_FAILURE); 11 } 12 int i = 0, j = 0, k = 0; 13 while (i < size1 && j < size2) { 14 if (arr1[i] < arr2[j]) { 15 mergedArray[k++] = arr1[i++]; 16 } else { 17 mergedArray[k++] = arr2[j++]; 18 } 19 } 20 while (i < size1) { 21 mergedArray[k++] = arr1[i++]; 22 } 23 while (j < size2) { 24 mergedArray[k++] = arr2[j++]; 25 } 26 return mergedArray; // 返回指向合并后數(shù)組的指針 27 } 28 int main() { 29 int arr1[] = {1, 3, 5, 7}; 30 int arr2[] = {2, 4, 6, 8}; 31 int size1 = sizeof(arr1) / sizeof(arr1[0]); 32 int size2 = sizeof(arr2) / sizeof(arr2[0]); 33 34 int* mergedArray = mergeSortedArrays(arr1, size1, arr2, size2); 35 cout << "合并后的鏈表: "; 36 for (int i = 0; i < size1 + size2; ++i) { 37 cout << mergedArray[i] << " "; 38 } 39 cout << endl; 40 free(mergedArray); 41 42 return 0; 43 }
(1)使用單鏈表運行的結(jié)果如圖所示:

第一個有序鏈表為1,3,5,7。
第二個有序鏈表為2,4,6,8。
更具題意進(jìn)行合并則為:1,2,3,4,5,6,7,8。
(2)使用順序表運行的結(jié)果如圖所示:

第一個順序表為:1,3,5,7。
第二個順序表為:2,4,6,8。
更具題意進(jìn)行合并則為:1,2,3,4,5,6,7,8。
總結(jié):通過本次實驗,我掌握了使用順序表和單鏈表進(jìn)行有序表合并的基本方法和技巧。順序表合并主要依賴于數(shù)組元素的比較和插入操作,而單鏈表合并則需要正確連接節(jié)點并處理尾節(jié)點。 這些知識和技能對于后續(xù)的數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)和算法設(shè)計具有重要的參考價值...

浙公網(wǎng)安備 33010602011771號