第四周上机实践—项目3(3)—判断单链表是否递增

来源:互联网 发布:windows nginx重启 编辑:程序博客网 时间:2024/04/29 20:31
/*    *Copyright(c)2015,烟台大学计算机与控制工程学院    *All rights reserved.    *文件名称:test.cpp    *作者:林莉    *完成日期:2015年9月30日 *版本号:v1.0        *问题描述:设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试*输入描述: *程序输出:  */  


测试函数:main.cpp

#include <stdio.h>#include <malloc.h>#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;}


 

头文件:LinkList.h

#ifndef LINKLIST_H_INCLUDED   #define LINKLIST_H_INCLUDED     typedef int ElemType;  typedef struct LNode        //定义单链表结点类型   {      ElemType data;      struct LNode *next;     //指向后继结点   }LinkList;  void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表   void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表   void InitList(LinkList *&L);  //初始化线性表   void DestroyList(LinkList *&L);  //销毁线性表   bool ListEmpty(LinkList *L);  //判断线性表是否为空   int ListLength(LinkList *L);  //求线性表长度   void DispList(LinkList *L);  //输出线性表   bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值   int LocateElem(LinkList *L,ElemType e);  //按元素值查找   bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素   bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素     #endif // LINKLIST_H_INCLUDED  


源文件:LinkList.cpp

#include <stdio.h>   #include <malloc.h>   #include "LinkList.h"      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 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指向尾结点,释放它   }  bool ListEmpty(LinkList *L)  {      return(L->next==NULL);  }  int ListLength(LinkList *L)  {      LinkList *p=L;      int i=0;      while (p->next!=NULL)      {          i++;          p=p->next;     }     return(i);  }  void DispList(LinkList *L)  {      LinkList *p=L->next;      while (p!=NULL)      {          printf("%d ",p->data);        p=p->next;      }      printf("\n");  }  bool GetElem(LinkList *L,int i,ElemType &e)  {      int j=0;      LinkList *p=L;      while (j<i && p!=NULL)      {          j++;          p=p->next;     }     if (p==NULL) //不存在第i个数据结点     return false;    else                    //存在第i个数据结点       {          e=p->data;         return true;      }  }  int LocateElem(LinkList *L,ElemType e)  {      LinkList *p=L->next;      int n=1;      while (p!=NULL && p->data!=e)      {         p=p->next;          n++;      }      if (p==NULL)          return(0);      else          return(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));//创建新结点*s           s->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个结点       {         p=p->next;      }      if (p==NULL)                //未找到位序为i-1的结点        return false;      {          q=p->next;              //q指向要删除的结点           if (q==NULL)              return false;           //若不存在第i个结点,返回false          e=q->data;          p->next=q->next;        //从单链表中删除*q结点           free(q);                //释放*q结点          return true;      }  }  


运行结果:

0 0