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

来源:互联网 发布:vscode react 调试 编辑:程序博客网 时间:2024/05/21 06:45

问题及代码:

/*  
* Copyright (c)2016,烟台大学计算机与控制工程学院  
* All rights reserved.  
* 文件名称:项目3.cpp  
* 作    者:董雪  
* 完成日期:2016年9月20日  
* 版 本 号:v1.0   
*问题描述:设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。  
*输入描述:无  
*程序输出:判断结果 
*/    

1.头文件:linklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef LINKLIST_H_INCLUDED</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#define LINKLIST_H_INCLUDED</span>typedef <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ElemType;typedef <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> LNode        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定义单链表结点类型</span>{    ElemType data;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> LNode *next;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//指向后继结点</span>}LinkList;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CreateListF(LinkList *&L,ElemType a[],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//头插法建立单链表</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CreateListR(LinkList *&L,ElemType a[],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//尾插法建立单链表</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> InitList(LinkList *&L);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化线性表</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> DestroyList(LinkList *&L);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//销毁线性表</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListEmpty(LinkList *L);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判断线性表是否为空</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ListLength(LinkList *L);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//求线性表长度</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> DispList(LinkList *L);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//输出线性表</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> GetElem(LinkList *L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType &e);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//求线性表某个数据元素值</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> LocateElem(LinkList *L,ElemType e);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//按元素值查找</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListInsert(LinkList *&L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType e);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//插入数据元素</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListDelete(LinkList *&L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType &e);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除数据元素</span></code><div><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"></span></div>

2.源文件:linklist.cpp,包含实现各种算法的函数的定义

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <malloc.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "linklist.h"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CreateListF(LinkList *&L,ElemType a[],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//头插法建立单链表</span>{    LinkList *s;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i;    L=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建头结点</span>    L->next=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i<n; i++)    {        s=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建新结点</span>        s->data=a[i];        s->next=L->next;            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//将*s插在原开始结点之前,头结点之后</span>        L->next=s;    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CreateListR(LinkList *&L,ElemType a[],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//尾插法建立单链表</span>{    LinkList *s,*r;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i;    L=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建头结点</span>    L->next=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>;    r=L;                    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//r始终指向终端结点,开始时指向头结点</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i<n; i++)    {        s=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建新结点</span>        s->data=a[i];        r->next=s;          <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//将*s插入*r之后</span>        r=s;    }    r->next=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>;           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//终端结点next域置为NULL</span>}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> InitList(LinkList *&L){    L=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建头结点</span>    L->next=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> DestroyList(LinkList *&L){    LinkList *p=L,*q=p->next;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (q!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    {        free(p);        p=q;        q=p->next;    }    free(p);    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//此时q为NULL,p指向尾结点,释放它</span>}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListEmpty(LinkList *L){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(L->next==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ListLength(LinkList *L){    LinkList *p=L;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (p->next!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    {        i++;        p=p->next;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(i);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> DispList(LinkList *L){    LinkList *p=L->next;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (p!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    {        printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d "</span>,p->data);        p=p->next;    }    printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\n"</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> GetElem(LinkList *L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType &e){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;    LinkList *p=L;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (j<i && p!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    {        j++;        p=p->next;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (p==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不存在第i个数据结点</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>                    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//存在第i个数据结点</span>    {        e=p->data;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>;    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> LocateElem(LinkList *L,ElemType e){    LinkList *p=L->next;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (p!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span> && p->data!=e)    {        p=p->next;        n++;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (p==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(n);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListInsert(LinkList *&L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType e){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;    LinkList *p=L,*s;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (j<i-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> && p!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//查找第i-1个结点</span>    {        j++;        p=p->next;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (p==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//未找到位序为i-1的结点</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//找到位序为i-1的结点*p</span>    {        s=(LinkList *)malloc(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(LinkList));<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建新结点*s</span>        s->data=e;        s->next=p->next;                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//将*s插入到*p之后</span>        p->next=s;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>;    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ListDelete(LinkList *&L,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,ElemType &e){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;    LinkList *p=L,*q;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (j<i-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> && p!=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//查找第i-1个结点</span>    {        j++;        p=p->next;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (p==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//未找到位序为i-1的结点</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//找到位序为i-1的结点*p</span>    {        q=p->next;              <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//q指向要删除的结点</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (q==<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>)            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>;           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//若不存在第i个结点,返回false</span>        e=q->data;        p->next=q->next;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//从单链表中删除*q结点</span>        free(q);                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//释放*q结点</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>;    }}</code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"></code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"></code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">3.源文件main.cpp:[cpp] view plain copy#include "linklist.h"  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;              else                  return 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;      }  </code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">运行结果截图:<img src="http://img.blog.csdn.net/20160920193449372?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">知识点总结:利用算法库的方法,可以比较前驱和后继的大小。</code><code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">学习心得:有点困难,要多练习。</code>

0 0
原创粉丝点击