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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* *Copyright (c) 2017,煙臺大學計算機與控制工程學院 *All rights reserved. *文件名稱:項目3-1、設計一個算法,將一個帶頭結點的數據域依次為a1,a2,…,an(n≥3)的單鏈表的所有結點逆置,即第一個結點的數據域變為an,…,最后一個結點的數據域為a1。實現這個算法,并完成測試。2、已知L1和L2分別指向兩個單鏈表的頭結點,且已知其長度分別為m、n,請設計算法將L2連接到L1的后面。實現這個算法,完成測試,并分析這個算法的復雜度。3、設計一個算法,判斷單鏈表L是否是遞增的。實現這個算法,并完成測試 *作 者:邵雪源 *完成日期:2017年12月13日 *版 本 號:v1.0 */ #include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode //定義單鏈表結點類型 {ElemType data;struct LNode *next; //指向后繼結點 }LinkList; void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立單鏈表 {LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList)); //創建頭結點L->next=NULL;r=L; //r始終指向終端結點,開始時指向頭結點for (i=0; i<n; i++){s=(LinkList *)malloc(sizeof(LinkList));//創建新結點s->data=a[i];r->next=s; //將*s插入*r之后r=s;}r->next=NULL; //終端結點next域置為NULL } void DestroyList(LinkList *&L) {LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p); //此時q為NULL,p指向尾結點,釋放它 } void DispList(LinkList *L) {LinkList *p=L->next;while (p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n"); }void Reverse(LinkList *&L) {LinkList *p=L->next,*q;L->next=NULL;while (p!=NULL) //掃描所有的結點{q=p->next; //讓q指向*p結點的下一個結點p->next=L->next; //總是將*p結點作為第一個數據結點L->next=p;p=q; //讓p指向下一個結點} } int main() {LinkList *L;ElemType a[]= {1,3,5,7, 2,4,8,10};CreateListR(L,a,8);printf("L:");DispList(L);Reverse(L);printf("逆置后L: ");DispList(L);DestroyList(L);return 0; }

已知L1和L2分別指向兩個單鏈表的頭結點,且已知其長度分別為m、n,設計算法將L2連接到L1的后面。

#include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode //定義單鏈表結點類型 {ElemType data;struct LNode *next; //指向后繼結點 }LinkList;st *&L,int i,ElemType &e); //刪除數據元素 void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立單鏈表 {LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList)); //創建頭結點L->next=NULL;r=L; //r始終指向終端結點,開始時指向頭結點for (i=0; i<n; i++){s=(LinkList *)malloc(sizeof(LinkList));//創建新結點s->data=a[i];r->next=s; //將*s插入*r之后r=s;}r->next=NULL; //終端結點next域置為NULL } void InitList(LinkList *&L) {L=(LinkList *)malloc(sizeof(LinkList)); //創建頭結點L->next=NULL; } void DestroyList(LinkList *&L) {LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p); //此時q為NULL,p指向尾結點,釋放它 } void DispList(LinkList *L) {LinkList *p=L->next;while (p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n"); } bool ListInsert(LinkList *&L,int i,ElemType e) {int j=0;LinkList *p=L,*s;while (j<i-1 && p!=NULL) //查找第i-1個結點{j++;p=p->next;}if (p==NULL) //未找到位序為i-1的結點return false;else //找到位序為i-1的結點*p{s=(LinkList *)malloc(sizeof(LinkList));//創建新結點*ss->data=e;s->next=p->next; //將*s插入到*p之后p->next=s;return true;} } void Link(LinkList *&L1, LinkList *&L2) {LinkList *p = L1;while(p->next != NULL) //找到L1的尾節點p = p->next;p->next = L2->next; //將L2的首個數據節點連接到L1的尾節點后free(L2); //釋放掉已經無用的L2的頭節點 } int main() {LinkList *A, *B;int i;ElemType a[]= {1,3,2,9};ElemType b[]= {0,4,7,6,5,8};InitList(A);for(i=3; i>=0; i--)ListInsert(A, 1, a[i]);InitList(B);for(i=5; i>=0; i--)ListInsert(B, 1, b[i]);Link(A, B);printf("A:");DispList(A);DestroyList(A);return 0; } 設計一個算法,判斷單鏈表L是否是遞增的
#include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode //定義單鏈表結點類型 {ElemType data;struct LNode *next; //指向后繼結點 }LinkList; void CreateListF(LinkList *&L,ElemType a[],int n)//頭插法建立單鏈表 {LinkList *s;int i;L=(LinkList *)malloc(sizeof(LinkList)); //創建頭結點L->next=NULL;for (i=0; i<n; i++){s=(LinkList *)malloc(sizeof(LinkList));//創建新結點s->data=a[i];s->next=L->next; //將*s插在原開始結點之前,頭結點之后L->next=s;} } void InitList(LinkList *&L) {L=(LinkList *)malloc(sizeof(LinkList)); //創建頭結點L->next=NULL; } void DestroyList(LinkList *&L) {LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p); //此時q為NULL,p指向尾結點,釋放它 } bool ListInsert(LinkList *&L,int i,ElemType e) {int j=0;LinkList *p=L,*s;while (j<i-1 && p!=NULL) //查找第i-1個結點{j++;p=p->next;}if (p==NULL) //未找到位序為i-1的結點return false;else //找到位序為i-1的結點*p{s=(LinkList *)malloc(sizeof(LinkList));//創建新結點*ss->data=e;s->next=p->next; //將*s插入到*p之后p->next=s;return true;} } bool ListDelete(LinkList *&L,int i,ElemType &e) {int j=0;LinkList *p=L,*q;while (j<i-1 && p!=NULL) //查找第i-1個結點{j++;p=p->next;}if (p==NULL) //未找到位序為i-1的結點return false;else //找到位序為i-1的結點*p{q=p->next; //q指向要刪除的結點if (q==NULL)return false; //若不存在第i個結點,返回falsee=q->data;p->next=q->next; //從單鏈表中刪除*q結點free(q); //釋放*q結點return true;} } bool increase(LinkList *L) {LinkList *p = L->next, *q; //p指向第1個數據節點if(p != NULL){while(p->next != NULL){q = p->next; //q是p的后繼if (q->data > p->data) //只要是遞增的,就繼續考察其后繼p = q;elsereturn false; //只要有一個不是后繼大于前驅,便不是遞增}}return true; } int main() {LinkList *A, *B;int i;ElemType a[]= {1, 3, 2, 9};ElemType b[]= {0, 4, 5 ,6, 7, 8};InitList(A);for(i=3; i>=0; i--)ListInsert(A, 1, a[i]);InitList(B);for(i=5; i>=0; i--)ListInsert(B, 1, b[i]);printf("A: %c\n", increase(A)?'Y':'N');printf("B: %c\n", increase(B)?'Y':'N');DestroyList(A);DestroyList(B);return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)的全部內容,希望文章能夠幫你解決所遇到的問題。

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