(第四周项目2)建设“单链表”算法库

来源:互联网 发布:苹果手机连点器软件 编辑:程序博客网 时间:2024/05/19 04:56
/* copyright (t) 2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:建设“单链表”算法库.cpp *作者:黄玉娇 *完成日期:2016年9月22日 *版本号:v1.0 *问题描述:建立单链表"算法库",实现单链表的基本运算 *输入描述:无 *程序输出:无 */

头文件:linklist.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 DestroyList(LinkList *&L);                   //销毁单链表  void DispList(LinkList *L);                       //输出单链表  void InitList(LinkList *&L);                      //初始化单链表(即创建一个头节点)  bool ListEmpty(LinkList *L);                      //判断单链表是否为空表  int ListLength(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);  //删除数据元素    

源文件: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的后继节点          L->next=s;                //L的指针域指向新插入的s      }  }  void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表  {      LinkList *s,*r;               //头指针*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];          r->next=s;          r=s;      }      r->next=NULL;                    //到尾  }  void DestroyList(LinkList *&L) //销毁单链表  {      LinkList *pre=L,*p=L->next;      while(p!=NULL)      {          free(pre);                     //释放*pre节点          pre=p;          p=pre->next;                   //“跟随”,同步后移      }      free(pre);                         //循环结束时pre已指向尾节点,释放尾节点,完成销毁  }  void DispList(LinkList *L)  //输出单链表  {      LinkList *p=L->next;      while(p!=NULL)      {          printf("%d ",p->data);          p=p->next;      }      printf("\n");  }  void InitList(LinkList *&L)  //初始化单链表(即创建一个头节点)  {      L=(LinkList *)malloc(sizeof(LinkList));      L->next=NULL;  }  bool ListEmpty(LinkList *L)   //判断单链表是否为空表  {      return (L->next!=NULL);  }  int ListLength(LinkList *L)  //求单链表长度  {      int length=0;      LinkList *p=L;           //长度初始化为0,p指向头节点      while(p->next!=NULL)      {          length++;          p=p->next;      }      return length;  }  bool GetElem(LinkList *L,int i,ElemType &e)      //求线性表中某个数据元素值  {      int j=0;      LinkList *p=L;                               //p指向头节点,j(头节点序号)置0      while(j<i && p!=NULL)      {          j++;          p=p->next;      }      if(p==NULL)                                  //不存在第i个数据节点,返回false          return false;      else                                         //存在第i个数据节点,返回true      {          e=p->data;          return true;      }  }  int LocateElem(LinkList *L,ElemType e)           //按元素值查找元素  {      int i=1;      LinkList *p=L->next;                         //p指向头节点,i(头节点序号)置1      while(p!=NULL && p->data!=e)                 //查找data值为e的节点,其序号为i      {          p=p->next;          i++;      }      if(p==NULL)                                  //不存在元素值为e的节点,返回0          return 0;      else                                         //存在元素值为e的节点,返回逻辑序号i          return i;  }  bool ListInsert(LinkList *&L,int i,ElemType e)   //插入数据元素  {      int j=0;      LinkList *p=L,*s;                            //p指向头节点,j(头节点序号)置0      while(j<i && p!=NULL)                        //遍历查找第i-1个节点      {          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,*s;      while(j<i && p!=NULL)      {          j++;          p=p->next;      }      if(p==NULL)      {          return false;      }      else      {          s=p->next;                               //s指向第i个节点          if(s==NULL)                              //第i个节点不存在,无法删除              return false;          else          {              e=s->data;              p->next=s->next;                     //删除*q节点              free(s);                             //释放*q节点              return true;                         //成功删除第i个节点          }      }  }  


主函数:main.cpp

#include <stdio.h>  #include <malloc.h>  #include "linklist.h"  int main()  {      LinkList *L;      ElemType a[8]= {7, 9, 8, 2, 0, 4, 6, 3};      ElemType e;      int i;        InitList(L);      printf("该表已被初始化\n");      if(ListEmpty(L))          printf("该表为非空表\n");      else          printf("该表为空表\n");        CreateListF(L, a, 8);      printf("头插法建表结果:");      DispList(L);      if(ListEmpty(L))          printf("该表为非空表\n");      else          printf("该表为空表\n");      printf("该表长度为:%d\n\n",ListLength(L));      DestroyList(L);      InitList(L);        CreateListR(L, a, 6);      printf("尾插法建表结果:");      DispList(L);      printf("该表长度为:%d\n\n",ListLength(L));        //接下来对尾插法建立的单链表进行操作      for(i=1;i<=ListLength(L)+4;i++)                 //测试第i个节点找到和找不到的情况      {          if(GetElem(L,i,e))              printf("找到第%d个元素,其值为:%d\n",i,e);          else              printf("第%d个元素未找到!\n",i);      }      printf("\n");        for(i=0;i<=ListLength(L)+4;i++)                 //测试第i个节点找到和找不到的情况      {          if(LocateElem(L,i))              printf("找到元素%d,它是表中的第%d个元素\n",i,LocateElem(L,i));          else              printf("元素%d未找到!\n",i);      }      printf("\n");        ListInsert(L,0,12);                             //测试成功插入和无法插入的情况      printf("插入元素12后表中各元素为:");      DispList(L);        ListInsert(L,4,15);      printf("插入元素15后表中各元素为:");      DispList(L);        ListInsert(L,8,17);      printf("插入元素17后表中各元素为:");      DispList(L);        ListInsert(L,12,26);      printf("插入元素26后表中各元素为:");      DispList(L);        ListDelete(L,0,e);                               //测试成功删除和无法删除的情况      printf("删除第1个节点后表中各元素为:");      DispList(L);        ListDelete(L,3,e);      printf("删除第4个节点后表中各元素为:");      DispList(L);        ListDelete(L,6,e);      printf("删除第6个节点后表中各元素为:");      DispList(L);        ListDelete(L,10,e);      printf("删除第10个节点后表中各元素为:");      DispList(L);        DestroyList(L);      return 0;  }  



运行结果:

知识点总结:

  单链表的基本运算

学习心得:

  较为全面的学习了链表


0 0
原创粉丝点击