工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2147|回复: 2

链表类的实现

[复制链接]
发表于 2006-4-2 19:08 | 显示全部楼层 |阅读模式
一直想学习数据结构,但常常是只看不做,结果只得个半懂.
近来几天有空就写一点,结果完成了一个链表类.
链表实现了,后面的堆栈和队列就不会困难了.
代码如下:

  1. #include<iostream>
  2. using namespace std;

  3. typedef int ElemType;

  4. //双向链表结构MyLink
  5. typedef struct Link{
  6.         ElemType data;
  7.         struct Link* prior;
  8.         struct Link* next;
  9. }MyLink;

  10. //链表类LinkList
  11. class LinkList
  12. {
  13. protected:
  14.         int length;                //链表长度
  15.         MyLink*head,*tail;        //定义表头和表尾指针
  16.        
  17. public:
  18.         LinkList();
  19.         LinkList(ElemType e);
  20.         ~LinkList();
  21.         int getLength(){return this->length;}           //获得长度
  22.         void insert(ElemType e);                       //插入元素到最后
  23.         void insert(ElemType e,int position);         //插入元素到指定位置
  24.         void print(char ch);                         //ch指定间隔符,默认换行输出
  25.         ElemType getElement(int index);             //获取指定索引位置的元素
  26.     int search(ElemType e);                    //搜索指定元素
  27.     void clear();                             //清空链表
  28.         void sort();                             //对所有元素进行升序排序
  29.         bool isEmpty();                         //判断是否为空
  30.         void del(int index);                   //删除指定位置元素
  31.         void merge(LinkList&);                //合并链表
  32. };
  33. //无参数构造函数
  34. LinkList::LinkList()
  35. {
  36.         head=new MyLink;
  37.         head->prior=NULL;
  38.         head->next=NULL;
  39.         tail=head;
  40.         length=0;
  41. }
  42. //有一个元素构造函数
  43. LinkList::LinkList(ElemType e)
  44. {
  45.         head=new MyLink;
  46.         head->prior=NULL;
  47.         head->next=new MyLink;
  48.         head->next->data=e;
  49.         tail=head->next;
  50.         tail->next=NULL;
  51.         length=1;
  52. }
  53. //析构函数
  54. LinkList::~LinkList()
  55. {
  56.         delete head;
  57. }
  58. //增加元素
  59. void LinkList::insert(ElemType e)
  60. {
  61.      insert(e,length+1);
  62. }
  63. //在指定位置插入元素
  64. void LinkList::insert(ElemType e,int position)
  65. {
  66.         if(position>length+1)return;
  67.         else if(position<=0)return;
  68.         MyLink*p=new MyLink;
  69.         p->data=e;
  70.         if (position==1)
  71.         {
  72.         p->prior=head;
  73.                 p->next=head->next;
  74.                 if(head->next!=NULL)head->next->prior=p;
  75.                 if(head==tail)tail=p;                   //如果原本为空,新插入元素
  76.                 head->next=p;
  77.                
  78.         }else if (position==length+1)
  79.         {
  80.                 p->prior=tail;
  81.                 p->next=NULL;
  82.                 tail->next=p;
  83.                 tail=tail->next;
  84.                
  85.         }else
  86.         {
  87.                 MyLink*temp;
  88.                 if(position>length/2)                   //根据要插入元素的位置选择
  89.                 {                                      //从头部还是尾部开始移动指针
  90.                         temp=tail;
  91.                         int i=length-position;
  92.                         while (i--)temp=temp->prior;
  93.                 }else
  94.                 {
  95.                         temp=head;
  96.                         while (position--)temp=temp->next;
  97.                 }
  98.                
  99.                 p->prior=temp->prior;                 //插到temp元素前面
  100.                 p->next=temp;
  101.                 temp->prior->next=p;
  102.                 temp->prior=p;
  103.                 temp=NULL;
  104.         }
  105.         p=NULL;        //给没用的指针一个NULL值是好习惯
  106.         length++;     //长度加1
  107. }
  108. //删除元素
  109. void LinkList::del(int index)
  110. {
  111.         if(index<=length&&index>0&&length!=0)
  112.         {
  113.                 MyLink*p=head;
  114.                 int i=index;
  115.                 if(index==1)
  116.                 {
  117.                         p=head->next;
  118.                         head->next=p->next;
  119.                         if(p->next!=NULL)p->next->prior=head;
  120.                         delete p;
  121.                 }else if(index==length)
  122.                 {
  123.                         p=tail;
  124.                         tail=p->prior;
  125.                         if(p->prior!=head)p->prior->next=tail;
  126.                         tail->next=NULL;
  127.                         delete p;
  128.                 }
  129.                 else
  130.                 {
  131.                         while(i--)p=p->next;
  132.                         p->prior->next=p->next;
  133.                         p->next->prior=p->prior;
  134.                         delete p;
  135.                 }
  136.                 p=NULL;
  137.                 length--;
  138.         }
  139. }
  140. int LinkList::search(ElemType e)
  141. {
  142.     MyLink*p=head->next;
  143.     for (int i=0;i<length;i++)
  144.     {
  145.         if(p->data==e)return (i+1);
  146.         p=p->next;
  147.     }
  148.     return 0;
  149. }
  150. //输出所有元素
  151. void LinkList::print(char ch='\n')
  152. {
  153.         MyLink*p=head->next;
  154.         while (p->next!=NULL)
  155.         {
  156.                 cout<<p->data<<ch;
  157.             p=p->next;
  158.         }
  159.     cout<<p->data<<endl;
  160. }
  161. //清空所有元素
  162. void LinkList::clear()
  163. {
  164.         MyLink*q,*p;
  165.         p=head->next;
  166.         while (p!=NULL)
  167.         {
  168.                 q=p->next;
  169.                 delete p;
  170.                 p=q;
  171.         }
  172.         length=0;
  173.         tail=head;
  174.         head->next=NULL;
  175. }
  176. //获取指定位置的元素
  177. ElemType LinkList::getElement(int index)
  178. {
  179.         if (index>0&&index<=length)
  180.         {
  181.                 if(index==1)return head->next->data;
  182.                 if(index==length)return tail->data;
  183.                 MyLink*p=head;
  184.         if (index>length/2)
  185.         {
  186.            int i=length-index;
  187.            p=tail;
  188.            while (i--)p=p->prior;
  189.         }
  190.                 else while(index--)p=p->next;
  191.                
  192.                 return p->data;
  193.         }
  194. }
  195. //判断链表是否为空
  196. bool LinkList::isEmpty()
  197. {
  198.         return head->next=NULL;
  199. }
  200. //
  201. void LinkList::sort()
  202. {   
  203.      MyLink*r,*h,*p,*temp;
  204.      h=new MyLink;
  205.      h->prior=NULL;
  206.      h->next=NULL;
  207.      p=h;
  208.      if (head->next!=NULL&&head->next->next!=NULL)
  209.      {
  210.         for(int i=length;i>0;i--)
  211.             {
  212.                 r=temp=head->next;
  213.                 while (r!=NULL)
  214.                 {
  215.                       if(r->data<temp->data)temp=r;
  216.                       r=r->next;
  217.                 }
  218.                 p->next=temp;
  219.                 if(temp->next!=NULL)temp->next->prior=temp->prior;
  220.                 temp->prior->next=temp->next;
  221.                 temp->prior=p;
  222.                 p=temp;
  223.                 p->next=NULL;
  224.              }
  225.          tail=p;
  226.          head->next=h->next;
  227.          h->next->prior=head;
  228.      }
  229.      delete h;
  230. }
  231. //合并链表
  232. void LinkList::merge(LinkList&link)
  233. {
  234.      this->tail->next=link.head->next;
  235.      link.head->next->prior=this->tail;
  236.      this->length+=link.length;
  237. }
复制代码

写了个main函数测试,基本上没有发现问题.
发表于 2006-4-2 20:16 | 显示全部楼层
过几天我也写个C#版的出来.
回复

使用道具 举报

发表于 2006-4-2 20:31 | 显示全部楼层
我之前写过个java版的.呵呵...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-6-6 06:37

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表