(第四周项目3)单链表应用

来源:互联网 发布:ecshop2.7.3破解优化 编辑:程序博客网 时间:2024/05/09 14:02

完成下面的应用时,除项目中给出的特殊要求,其余工作均可利用项目2完成的算法支持。
  1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。
提示:实现算法时,可以设计下面的函数:void Reverse(LinkList *&L)
  2、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
提示:实现算法时,可以设计下面的函数:void Link(LinkList &L1, LinkList &L2)
  3、设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。

1.

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指向下一个结点    }}


main

int main(){    LinkList *L;    ElemType a[]= {1,2,3,4,5};    CreateListR(L,a,5);    Reverse(L);    DispList(L);    DestroyList(L);    return 0;}

结果

2.

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的头节点}


 

#include"list.h"int main(){LinkList *A, *B;    int i;    ElemType a[]= {1,3,2,9};    ElemType b[]= {0,4,7,6,5,8};    InitList(A);CreateListR(A,a,4);CreateListR(B,b,6);    /*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;}

结果

3.

bool Tell(LinkList *&L){LinkList *p = L,*q=L->next;while(p->next != NULL)   //找到L1的尾节点{if(p->data<q->data){p = q;q=q->next;}elsereturn false;}return true;}

main

#include"list.h"int main(){LinkList *A, *B;    int i;    ElemType a[]= {1,3,2,9};        InitList(A);CreateListR(A,a,4);    if(Tell(A)){DispList(A);printf("增\n");}else{DispList(A);printf("不增\n");}    DestroyList(A);return 0;}

结果



总结

code blocks cpp文件新建要选择两个编译选项...

第一个程序还不很理解。现在依旧不理解。

第二个程序不用加length,这个是线性表的特点。

L->next是第一个数据节点。


0 0