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

来源:互联网 发布:免费一级域名注册 编辑:程序博客网 时间:2024/06/16 13:25

问题及代码:

/    烟台大学计控学院     作    者:房斐完成日期:2016.9.23问题描述:设计一个算法,判断单链表是否是递增的。  / 

LinkList.h

#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);//头插法建立单链表    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);  //删除数据元素    void Reverse(LinkList *&L);  void Link(LinkList *&L1,LinkList *&L2);  bool increase (LinkList *L);

LinkList.cpp

#include"LinkList.h"    void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表    {        LinkList *s;        int i;        L=(LinkList *)malloc(sizeof(LinkList));        L->next=NULL;//创建头结点,其next域为NULL        for(i=0;i<n;i++)        {            s=(LinkList *)malloc(sizeof(LinkList));            s->data=a[i];//创建数据节点*s            s->next=L->next;            L->next=s;        }    }    void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表    {            LinkList *s,*r;            int i;            L=(LinkList *)malloc(sizeof(LinkList));            r=L;            for(i=0;i<n;i++)            {                s=(LinkList *)malloc(sizeof(LinkList));                s->data=a[i];//创建数据节点*s                r->next=s;//将*s插在*r之后                r=s;            }            r->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) //求线性表长度    {        int n=0;        LinkList *p=L;        while(p->next!=NULL)        {            n++;            p=p->next;        }        return (n);    }    bool GetElem(LinkList *L,int i,ElemType &e)  //求线性表某个数据元素值    {        int j=0;        LinkList *p=L;        while(j<i&&p!=NULL)        {            j++;            p->next;        }        if(p==NULL)            return false;        else        {            e=p->data;            return true;        }    }     int LocateElem(LinkList *L,ElemType e)  //按元素值查找    {        int i=1;        LinkList *p=L->next;        while(p!=NULL&&p->data!=e)        {            p=p->next;            i++;        }        if(p==NULL)            return (0);        else            return(i);    }    bool ListInsert(LinkList *&L,int i,ElemType e)  //插入数据元素    {        int j=0;        LinkList *p=L,*s;//p指向头结点,j置为0        while(j<i-1&&p!=NULL)        {            j++;            p=p->next;        }        if(p==NULL)            return false;        else        {            s=(LinkList *)malloc(sizeof(LinkList));            s->data=e;            s->next=p->next;            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)        {            j++;            p=p->next;        }        if(p==NULL)            return false;        else        {            q=p->next;            if(q==NULL)                return false;            e=q->data;            p->next=q->next;            free(q);            return true;        }    }    void DispList(LinkList *L)  //输出单链表    {        LinkList *p=L->next;//p开始指向节点        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;          p->next=L->next;          L->next=p;          p=q;      }  }  void Link(LinkList *&L1,LinkList *&L2)  {      LinkList *p=L1;      while(p->next!=NULL)      {          p=p->next;      }      p->next=L2->next;      free(L2);  }  bool increase(LinkList *L)  {      LinkList *p=L->next,*q;      if(p!=NULL)      {          while(p->next!=NULL)          {              q=p->next;//q是p的后继          if(q->data>p->data) //只要是递增的,就继续考察其后继              p=q;          else              return false;//只要有一个不是后继大于前驱,便不是递增          }      }      return true;  }  

main.cpp

#include"LinkList.h"    int main()    {     LinkList *A,*B; int i; ElemType a[]={3,4,5,7}; ElemType b[]={1,4,8,7,1,3};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]);DispList(A);printf("A: %c\n",increase(A)?'Y':'N');DispList(B);printf("B: %c\n",increase(B)?'Y':'N');DestroyList(A);DestroyList(B);return 0;}    
运行结果:

知识点总结:

运用指针比较单链表前后相邻数的大小。

0 0
原创粉丝点击