/*
循环链表
循环单链表
总之就是记得,尾结点的next指针始终指向头结点(地址为L)就好
初始头结点指向L(L->next = L),判空也是这个条件
因为操作常在表头表尾进行,常不设头指针而仅设尾指针(反正尾结点下一个就是头结点)
*/
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
#define ElemType int
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化循环单链表(带头结点)
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = L; //这句和普通单链表不一样
return true;
}
//循环单链表建立(尾插法 带头结点)
LinkList List_TailInsert(LinkList& L) {
int x;
LNode* s, * r = L;
scanf_s("%d", &x);
while (x != 999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf_s("%d", &x);
}
r->next = L;
return L;
}
//循环单链表建立(头插法 带头结点)
LinkList List_HeadInsert(LinkList& L) {
LNode* s;
ElemType x;
scanf_s("%d", &x);
while (x != 999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
//循环单链表建立(尾插法 带头结点 只设尾指针 不设头指针)
LinkList TpList_TailInsert(LinkList& L) { //tp意思是Tail pointer
int x;
LNode* s; //机动
LNode* r = L; //始终指向尾结点(初始头结点即为尾结点)
scanf_s("%d", &x);
while (x != 999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf_s("%d", &x);
}
r->next = L;
L = r;
return L;
}
//只设尾指针的循环单链表的表尾插入(带头结点)
bool TpList_TailInsertNode(LinkList L, ElemType e) {
if (L == NULL) return false; //指定结点为空
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) return false; //内存分配失败,不写也可
s->data = e;
s->next = L->next; //与下一句不可颠倒
L->next = s;
return true;
}
//输出全表(带头结点)
void PrintList(LinkList L) {
LNode* s = L->next;
while (s != L) {
printf("%d ", s->data);
s = s->next;
}
cout << "\n";
}
//输出只设尾指针的循环单链表全表(带头结点)
void PrintList_from_r(LinkList L) {
LNode* s = L->next->next;
while (s != L->next) {
printf("%d ", s->data);
s = s->next;
}
cout << "\n";
}
int main() {
LinkList L1, L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);
cout << "请输入L1的值(尾插法),空格为界,999结束:\n";
List_TailInsert(L1); //单链表建立-尾插法
cout << "请输入L2的值(头插法),空格为界,999结束:\n";
List_HeadInsert(L2); //单链表建立-头插法
cout << "请输入L2的值(只设尾指针尾插法),空格为界,999结束:\n";
TpList_TailInsert(L3);
cout << "L1(尾插法):\n";
PrintList(L1);
cout << "L2(头插法):\n";
PrintList(L2);
cout << "L3(只带尾指针尾插法):\n";
PrintList_from_r(L3);
}
数据结构C++实现——线性表之链表(循环链表)
最新推荐文章于 2022-09-22 11:00:03 发布