环形单链表的实现基本字典操作


 概念定义:  

    环形单链表是单链表的另一种形式,其结构特点链表中最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循环链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作较为方便。所以本文中就用带头结点的循环单链表。

#include <iostream>
#include <time.h>
using namespace std;
#define LEN sizeof(struct List)
struct List*head=NULL;//链表头部
struct List*tail=NULL;//链表尾部
struct List
{
    int key;
    struct List*next;
};
//插入数据
struct List*insert(struct List *p,struct List*x)
{//由于链表没有像数组一样的越界限制,所以不用检查上溢。
    x=(struct List*)malloc(LEN);//最多会出现不能申请堆中内存。
    x->key=rand()%100;
    p=tail;
    if (head==NULL)
    {
        p=head=x;
    }
    else
    {
        p->next=x;
        p=p->next;
    }
    p->next=head;
    tail=p;
    return p;
}
//按顺序从头删除函数
struct List*In_order_to_delete(struct List *p)
{//时间复杂度为O(1)
    struct List *x;
    x=p=head;
    if (head==NULL)//当链表里没有元素而继续删除时,会发生上溢。
    {
        cout<<"underflow!"<<endl;
        return NULL;
    }
    else
    {
        if (tail==head)
        {
            head=tail=NULL;
        } 
        else
        {
            p=p->next;
            head=p;
            tail->next=head;
        }
        return x;
    }
}
bool search(struct List *p,int k);
//删除指定元素函数
struct List*Delete_specified_element(struct List *p,int k)
{//这个函数代表了最坏情况删除元素的时间复杂度O(n)
  if (!search(p,k))
  {
      cout<<"不存在这个数据,无法删除!"<<endl;
      return NULL;
  }
  else
  {
      p=head;
      if (p->key==k)//如果头结点即为所要查找的k
      {
          p=p->next;
          head=p;
          tail->next=p;
      }
      else//否则进入循环
      {
          while (p->next->key!=k)
          {
              p=p->next;
          }
          p->next=p->next->next;
      }
      return head;
  }
}
//查找数据
bool search(struct List *p,int k)
{
   p=head;
   while (p!=tail&&p->key!=k)
   {
       p=p->next;
   }
   if (p==tail&&p->key!=k)
   {
       cout<<"没有找到!"<<endl;
       return false;
   }
   else
   {
       cout<<"已经找到!"<<p->key<<endl;
       return true;
   }
}
void Print()  
{  
    struct List*p =head; 
    if(p!=NULL)
    {
        while(p->next!=head)  
        {  
            cout<<p->key<<"->";  
            p = p->next;  
        } 
        cout<<p->key<<"->"<<endl;
    }
    else
    {
        cout<<"此链表为空!"<<endl;
    }
} 
void main()
{
   struct List *p=NULL,*x=NULL;
   srand( (unsigned)time( NULL ) );
   cout<<"数据插入链表中。。"<<endl;
   for (int i=0;i<30;i++)
   {
       insert(p,x);
   }
   Print();
   cout<<"查找特定元素中。。"<<endl;
   search(p,60);
   cout<<"按顺序删除的元素如下:";
   for ( i=0;i<=3;i++)
   {
       p=In_order_to_delete(p);
       if (p==NULL)
       {
           continue;
       }
       cout<<p->key<<"->";
   }
   cout<<endl;
   cout<<"打印删除数个元素后的数据:"<<endl;
   Print();
   cout<<"删除特定元素中。。"<<endl;
   Delete_specified_element(p,11);
   cout<<"删除特定元素后链表中剩下的数据"<<endl;
   Print();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值