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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

四、双向链表复制

發布時間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四、双向链表复制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

四、雙向鏈表復制

文章目錄

  • 四、雙向鏈表復制
    • 題目描述
    • 解題思路
    • 上機代碼

題目描述

設一帶頭結點的雙向循環鏈表表示的線性表:L =(a1, a2, …… , an)
請寫出一個時間復雜度為O(n)的算法,將L改造為:L =(a1, a2, ……, an-1, an, an-1, ……, a2, a1)

預設代碼:

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW *//* 設一帶頭結點的雙向循環鏈表表示的線性表: L =(a1, a2, …… , an) 請寫出一個時間復雜度為O(n)的算法,將L改造為: L =(a1, a2, ……, an-1, an, an-1, ……, a2, a1) */#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct DuLNode {ElemType data; // 數據域struct DuLNode *prior; // 指向前驅的指針域struct DuLNode *next; // 指向后繼的指針域 } DuLNode, * DuLinkList;// 函數原型 void out_next(DuLinkList); void out_prior(DuLinkList); void rcopy(DuLinkList); //這是你要編寫的函數 // 函數定義 void out_next(DuLinkList DHead) { DuLinkList p = DHead->next; while ( p != DHead ){ printf("%d,", p->data);p = p->next;}printf("\n"); } void out_prior(DuLinkList DHead) { DuLinkList p = DHead->prior; while ( p != DHead ){ printf("%d,", p->data);p = p->prior;}printf("\n"); }int main() { DuLinkList DHead, p;int num;DHead = (DuLNode*)malloc( sizeof(DuLNode));DHead->data = -1;DHead->prior = DHead->next = DHead; // 生成表頭scanf("%d", &num);while ( num != -1 ){ p = (DuLNode*)malloc( sizeof(DuLNode));p->data = num;p->next = DHead->next; // 1.鏈接p的next鏈 DHead->next = p; // 2.鏈接DHead的next鏈p->next->prior = p; // 3.鏈接p的next的prior鏈p->prior = DHead; // 4.鏈接p的prior鏈scanf("%d", &num);}printf("Link next:"); out_next( DHead );printf("Link prior:"); out_prior( DHead );rcopy( DHead );printf("NewL next:"); out_next( DHead );printf("NewL prior:"); out_prior( DHead );return 0; } /************************************** void rcopy(DuLinkList DHead) {This function is wating for you. } ***************************************//* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 測試輸入期待的輸出時間限制內存限制額外進程
測試用例 11 2 3 4 5 -1Link next:5,4,3,2,1,
Link prior:1,2,3,4,5,
NewL next:5,4,3,2,1,2,3,4,5,
NewL prior:5,4,3,2,1,2,3,4,5,
1秒64M0
測試用例 210 20 -1Link next:20,10,
Link prior:10,20,
NewL next:20,10,20,
NewL prior:20,10,20,
1秒64M0
測試用例 31 2 3 4 5 6 7 8 9 10 11 12 -1Link next:12,11,10,9,8,7,6,5,4,3,2,1,
Link prior:1,2,3,4,5,6,7,8,9,10,11,12,
NewL next:12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,11,12,
NewL prior:12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,11,12,
1秒64M0

解題思路

函數參數傳入的是頭結點Dhead的位置,Dhead->prior 即找到an結點。使用兩個指針p、q,其中p指向an結點。

p指針向左掃描一個位置,就利用q指針向右建立一個結點,仿照main函數中的操作建立雙向循環鏈表即可。

上機代碼

void rcopy(DuLinkList DHead) {//找到an結點DuLinkList p = DHead->prior, q=NULL;//建立雙向循環鏈表while(p->prior != DHead){p = p->prior;q = (DuLNode*)malloc(sizeof(DuLNode));q->data = p->data;q->prior = DHead->prior;q->prior->next = q;q->next = DHead;q->next->prior = q;} }

總結

以上是生活随笔為你收集整理的四、双向链表复制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。