第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)
生活随笔
收集整理的這篇文章主要介紹了
第四周实践项目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;
}
#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位技術專家共同創作,文字、視頻、音頻交互閱讀
已知L1和L2分別指向兩個單鏈表的頭結點,且已知其長度分別為m、n,設計算法將L2連接到L1的后面。
#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单链表:逆置、连接与递增判断(包含三个程序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四周实践项目2 算法库——单链表
- 下一篇: 第四周实践项目4 建立算法库——双链表