循环链表是头尾相连的单链表,它的操作大致与单链表一致.单链表判断是否到达表尾的方式是判断指针域是否为空,而循环链表是判断指针域是否指向头结点.
结构体定义
提示:
- 应有数据域和指向下一个结点的指针域
typedef struct CLinkNode {
int data;//数据域
CLinkNode *next;//指针域
}CLinkList,CLinkNode;
初始化
提示:
- 内存分配是否成功?
- 头结点的next域是否初始化?
bool initList(CLinkList* &c) {
c = new CLinkList;
if (!c) {//内存分配是否成功?
return false;
}
c->next = c;//头结点的next域是否初始化?
return true;
}
插入元素
提示:
- 传入的链表是否有效?
- 插入元素的指针域要指向头结点.
void insertList(CLinkList *c, int data) {
if (!c) {//传入的链表是否有效?
return;
}
CLinkNode *e = new CLinkNode;
CLinkNode *node = c;
e->data = data;
while (node->next != c) {
node = node->next;
}
e->next = c;//插入元素的指针域要指向头结点.
node->next = e;
}
删除元素
提示:
- 链表是否为空?
- 删除位置是否合法?
- 是否释放了删除结点的内存?
void deleteList(CLinkList *c, int n) {
if (c->next == c) {//链表是否为空?
cout << "链表为空!" << endl;
return;
}
CLinkNode *e,*node;
e = c;
for (int i = 1; i < n; i++) {
e = e->next;
if (e -> next == c) {//删除位置是否合法?
cout << "删除位置不合法!" << endl;
return;
}
}
node = e->next;
e->next = e->next->next;
delete node;//是否释放了删除结点的内存?
}
打印链表元素
无提示,选择自己喜欢的打印风格.
void printList(CLinkList *c) {
CLinkNode *e = c->next;
while (e != c) {
cout << e->data << "\t";
e = e->next;
}
cout << endl;
}
全部代码及测试代码
#include <iostream>
using namespace std;
typedef struct CLinkNode {
int data;
CLinkNode *next;
}CLinkList,CLinkNode;
bool initList(CLinkList* &c) {
c = new CLinkList;
if (!c) {
return false;
}
c->next = c;
return true;
}
void insertList(CLinkList *c, int data) {
if (!c) {
return;
}
CLinkNode *e = new CLinkNode;
CLinkNode *node = c;
e->data = data;
while (node->next != c) {
node = node->next;
}
e->next = c;
node->next = e;
}
void deleteList(CLinkList *c, int n) {
if (c->next == c) {
cout << "链表为空!" << endl;
return;
}
CLinkNode *e,*node;
e = c;
for (int i = 1; i < n; i++) {
e = e->next;
if (e -> next == c) {
cout << "删除位置不合法!" << endl;
return;
}
}
node = e->next;
e->next = e->next->next;
delete node;
}
void printList(CLinkList *c) {
CLinkNode *e = c->next;
while (e != c) {
cout << e->data << "\t";
e = e->next;
}
cout << endl;
}
int main(void) {
CLinkList *c;
initList(c);
int n,data;
cout << "请输入插入元素的个数:";
cin >> n;
while (n--) {
cout << "请输入元素:";
cin >> data;
insertList(c, data);
}
printList(c);
cout << "请输入删除元素的位置:";
cin >> n;
deleteList(c, n);
printList(c);
system("pause");
return 0;
}