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

来源:互联网 发布:怎么复制图片淘宝店铺 编辑:程序博客网 时间:2024/06/06 02:14
  1. /* 
  2.  *Copyright (c) 2016,烟台大学计算机学院 
  3.  *All rights reserved. 
  4.  *文件名称:danlianbiao.cpp 
  5.  *作者:衣龙川 
  6.  *完成日期:2016年9月26日 
  7.  *版本号:vc++6.0 
  8.  * 
  9.  *问题描述:单链表的逆序输出 
  10.  *输入描述:无 
  11.  *程序输出:调整后的单链表 
  12. */  
  13. #ifndef LINKLIST_H_INCLUDED  
  14. #define LINKLIST_H_INCLUDED  
  15. #include<malloc.h>  
  16. #include<stdio.h>  
  17. #include<iostream>  
  18. typedef int ElemType;  
  19. typedef struct LNode        //定义单链表结点类型  
  20. {  
  21.     ElemType data;  
  22.     struct LNode *next;     //指向后继结点  
  23. }LinkList;  
  24. void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表  
  25. void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表  
  26. void InitList(LinkList *&L);  //初始化线性表  
  27. void DestroyList(LinkList *&L);  //销毁线性表  
  28. bool ListEmpty(LinkList *L);  //判断线性表是否为空  
  29. int ListLength(LinkList *L);  //求线性表长度  
  30. void DispList(LinkList *L);  //输出线性表  
  31. bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值  
  32. int LocateElem(LinkList *L,ElemType e);  //按元素值查找  
  33. bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素  
  34. bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素  
  35. void Reverse(LinkList *&L);  
  36. #endif // LINKLIST_H_INCLUDED  

[html] view plain copy
  1. #include "link.h"  
  2. int main()  
  3. {  
  4.     LinkList *L;  
  5.     ElemType a[]= {1,3,5,7, 2,4,8,10};  
  6.     CreateListR(L,a,8);  
  7.     printf("L:");  
  8.     DispList(L);  
  9.     Reverse(L);  
  10.     printf("逆置后L: ");  
  11.     DispList(L);  
  12.     DestroyList(L);  
  13.     return 0;  
  14. }  

[cpp] view plain copy
  1. #include "link.h"  
  2. //头插法  
  3. void CreateListF(LinkList *&L,ElemType a[],int n)  
  4. {  
  5.     LinkList *s;  
  6.     L=(LinkList *)malloc(sizeof(LinkList));  
  7.     L->next=NULL;  
  8.     for(int i=0;i<n;i++)  
  9.     {  
  10.         s=(LinkList *)malloc(sizeof(LinkList));  
  11.         s->data=a[i];  
  12.         s->next=L->next;  
  13.         L->next=s;  
  14.     }  
  15. }  
  16. //尾插法  
  17. void CreateListR(LinkList *&L,ElemType a[],int n)  
  18. {  
  19.     LinkList *s,*r;  
  20.     L=(LinkList *)malloc(sizeof(LinkList));  
  21.     r=L;  
  22.     for(int i=0;i<n;i++)  
  23.     {  
  24.        s=(LinkList *)malloc(sizeof(LinkList));  
  25.        s->data=a[i];  
  26.        r->next=s;  
  27.        r=s;  
  28.     }  
  29.     r->next=NULL;  
  30. }  
  31. //初始化线性表  
  32. void InitList(LinkList *&L)  
  33. {  
  34.     L=(LinkList *)malloc(sizeof(LinkList));  
  35.     L->next=NULL;  
  36. }  
  37. //销毁线性表  
  38. void DestroyList(LinkList *&L)  
  39. {  
  40.     LinkList *pre=L,*p=L->next;  
  41.     while(p!=NULL)  
  42.     {  
  43.         free(pre);  
  44.         pre=p;  
  45.         p=pre->next;  
  46.     }  
  47.     free(pre);  
  48. }  
  49. //判断线性表是否为空  
  50. bool ListEmpty(LinkList *L)  
  51. {  
  52.     return(L->next==NULL);  
  53. }  
  54.  //求线性表长度  
  55. int ListLength(LinkList *L)  
  56. {  
  57.     int n=0;  
  58.     LinkList *p=L;  
  59.     while(p->next!=NULL)  
  60.     {  
  61.         n++;  
  62.         p=p->next;  
  63.     }  
  64.     return n;  
  65. }  
  66.   //输出线性表  
  67. void DispList(LinkList *L)  
  68. {  
  69.     LinkList *p=L->next;  
  70.     while(p!=NULL)  
  71.     {  
  72.         printf(" %d",p->data);  
  73.         p=p->next;  
  74.     }  
  75.     printf("\n");  
  76. }  
  77.   //求线性表某个数据元素值  
  78. bool GetElem(LinkList *L,int i,ElemType &e)  
  79. {  
  80.     int j=0;  
  81.     LinkList *p=L;  
  82.     while(j<i&&p!=NULL)  
  83.     {  
  84.         j++;  
  85.         p=p->next;  
  86.     }  
  87.     if(p==NULL)  
  88.         return false;  
  89.     else   
  90.     {  
  91.         e=p->data;  
  92.         return true;  
  93.     }  
  94. }  
  95.   //按元素值查找  
  96. int LocateElem(LinkList *L,ElemType e)  
  97. {  
  98.     int i=1;  
  99.     LinkList *p=L->next;  
  100.     while(p!=NULL&&p->data!=e)  
  101.     {  
  102.         p=p->next;  
  103.         i++;  
  104.     }  
  105.     if(p==NULL)  
  106.         return 0;  
  107.     else return 1;  
  108. }  
  109.   //插入数据元素  
  110. bool ListInsert(LinkList *&L,int i,ElemType e)  
  111. {  
  112.     int j=0;  
  113.     LinkList *p=L,*s;  
  114.     while(j<i-1&&p!=NULL)  
  115.     {  
  116.         j++;  
  117.         p=p->next;  
  118.     }  
  119.     if(p==NULL)  
  120.         return false;  
  121.     else  
  122.     {  
  123.         s=(LinkList *)malloc(sizeof(LinkList));  
  124.         s->data=e;  
  125.         s->next=p->next;p->next=s;  
  126.         return true;  
  127.     }  
  128. }  
  129.   //删除数据元素  
  130. bool ListDelete(LinkList *&L,int i,ElemType &e)  
  131. {  
  132.     int j=0;  
  133.     LinkList *p=L,*q;  
  134.     while(j<i-1&&p!=NULL)  
  135.     {  
  136.         j++;  
  137.         p=p->next;  
  138.     }  
  139.     if(p==NULL)  
  140.         return false;  
  141.     else  
  142.     {  
  143.         q=p->next;  
  144.         if(q==NULL)  
  145.             return false;  
  146.         e=q->data;  
  147.         p->next=q->next;  
  148.         free(q);  
  149.         return true;  
  150.     }  
  151. }  

[cpp] view plain copy
  1. //节点逆序  
  2. #include "link.h"  
  3. void Reverse(LinkList *&L)  
  4. {  
  5.     LinkList *p=L->next,*q;  
  6.     L->next=NULL;  
  7.     while (p!=NULL)     //扫描所有的结点  
  8.     {  
  9.         q=p->next;      //让q指向*p结点的下一个结点  
  10.         p->next=L->next;    //总是将*p结点作为第一个数据结点  
  11.         L->next=p;  
  12.         p=q;            //让p指向下一个结点  
  13.     }  
  14.   
  15. }  


运行结果:

 

知识点总结:学会了利用两个指针进行单链表的逆序输出。


0 0