线性表的链式表示---循环单链表(C++)

循环单链表

循环单链表和单链表的区别在于,表中的最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。

循环单链表可以从表中任意一个结点开始遍历整个链表。不仅可以设置头指针,还可设置尾指针,对于表头与表尾进行操作都只需要O(1)的时间复杂度

循环单链表中结点类型的描述如下:

typedef struct RNode {
 ElemType data;
 RNode* next;
}RNode, * RLinkList;

初始化链表:

RLinkList InitList(RLinkList& L) {
 if (L == NULL) {
  return NULL;
 }
 L = new RNode;
 L->next = L;
 return L;
}

头插法建立链表

RLinkList HeadInsert(RLinkList& L) {
 cout << "采用头插法建立循环单链表:" << endl;
 int x;
 cin >> x;
 while (x != 9999) {
  RNode* s = new RNode;
  s->data = x;
  s->next = L->next;
  L->next = s;
  cin >> x;
 }
 return L;
}

尾插法建立链表

RLinkList TailInsert(RLinkList& L) {
 cout << "采用尾插法建立循环单链表:" << endl;
 int x;
 cin >> x;
 RNode* q = L;
 while (x != 9999) {
  RNode* s = new RNode;
  s->data = x;
  s->next = q->next;
  q->next = s;
  q = s;
  cin >> x;
 }
 return L;
}

按值查找操作

int LocateElem(RLinkList L, ElemType e) {
 RNode* s = new RNode;
 s = L->next;
 int i = 1;
 while (s->data != e && s != L) {
  s = s->next;
  i++;
 }
 if (s == L) {
  return NULL;
 }
 else {
  return i;
 }
}

按位查找操作

ElemType GetElem(RLinkList L, int i) {
 RNode* s = new RNode;
 s = L->next;
 int j = 1;
 while (j < i - 1&&s!=L) {
  s = s->next;
  j++;
 }
 if (i == 1) {
  return s->data;
 }
 return s->next->data;
}

插入操作

bool InsertList(RLinkList& L, int i, ElemType e) {
 if (i < 1) {
  return false;
 }
 int j = 1;
 RNode* s = new RNode;
 RNode* p = new RNode;
 s = L->next;
 while (j < i - 1 && s != L) {
  s = s->next;
  j++;
 }
 p->data = e;
 p->next = s->next;
 s->next = p;
 return true;
}

删除操作

bool ListDelete(RLinkList& L, int i, ElemType& e) {
 if (i < 1) {
  return false;
 }
 RNode* s, * p;
 int j = 1;
 s = L->next;
 while (i < j - 1 && s->next != L) {
  s = s->next;
  j++;
 }
 p = s->next;
 if (p == L) {
  return false;
 }
 e = p->data;
 s->next = p->next;
 free(p);
 return true;
}

遍历

void PrintList(RLinkList L) {
 RNode* s = new RNode;
 s = L->next;
 while (s != L) {
  cout << s->data << "\t";
  s = s->next;
 }
 cout << endl;
}

销毁表

bool DestoryList(RLinkList& L) {
 if (L->next == L) {
  return true;
 }
 RNode* s = new RNode;
 while (L->next != L) {
  s = L->next;
  L->next = s->next;
  free(s);
 }
 return true;
}

表中元素个数

int Length(RLinkList L) {
 RNode* s = L;
 int i = 0;
 while (s->next != L) {
  s = s->next;
  i++;
 }
 return i;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值