带头结点循环单链表
有问题可以在评论区讨论
#include<stdio.h>
#include<malloc.h>
#define _CRT_SECURE_NO_WARNINGS
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//按位查找
LNode* GetElem(LinkList, int);
//按值查找
LNode* LocateElem(LinkList, ElemType);
//求表长
int Length(LinkList);
//按位序插入
bool ListInsert(LinkList&, int, ElemType);
//指定结点后插操作
bool InsertNextNode(LinkList&, LNode*, ElemType);
//指定结点前插操作(使用之前最好判断一下该结点是否为头节点)
bool InsertPriorNode(LinkList& ,LNode*, ElemType);
//按位序删除
bool ListDelete(LinkList&, int, ElemType&);
//指定结点删除
bool DeleteNode(LinkList&, LNode*);
//初始化单链表
bool InitList(LinkList&);
//尾插法建立单链表
bool ListTailInsert(LinkList&);
//头插法建立单链表
bool ListHeadInsert(LinkList&);
//遍历链表
void Traverse(LinkList);
int main(void) {
LinkList L;
ListTailInsert(L);
//ListHeadInsert(L);
//Traverse(L);
//printf("表长为:%d\n", Length(L));
LNode* p;
p = GetElem(L, 4);
/*p = LocateElem(L, 23);
if (p == NULL) {
printf("未查到该结点\n");
}
else {
printf("p->data = %d\n", p->data);
}*/
Traverse(L);
//ListInsert(L, 2, 8888);
/*InsertNextNode(p, 7777);
Traverse(L);*/
//InsertPriorNode(L, p, 0);
/*ElemType e;
ListDelete(L, 3, e);
printf("删除e = %d\n", e);*/
DeleteNode(L, p);
Traverse(L);
return 0;
}
LNode* GetElem(LinkList LTail, int i) {
if (i < 0 || LTail == NULL) {
return NULL;
}
LNode* p = LTail->next;
int j = 0;
while (j < i) {
//当循环一圈后还没有退出循环,直接退出
if (p == LTail) {
return NULL;
}
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList LTail, ElemType e) {
if (LTail == NULL) {
return NULL;
}
if (LTail->data == e) {
return LTail;
}
LNode* p = LTail->next->next;
//p == LTail防止链表中没有该元素
while (p->data != e) {
p = p->next;
if (p == LTail) {
return NULL;
}
}
return p;
}
int Length(LinkList LTail) {
if (LTail == NULL) {
return -1;
}
LNode* p = LTail;
int j = 0;
while (p->next != LTail) {
p = p->next;
j++;
}
return j;
}
bool ListInsert(LinkList& LTail, int i, ElemType e) {
if (i < 1) {
return false;
}
LNode* p = GetElem(LTail, i - 1);
return InsertNextNode(LTail, p, e);
}
bool InsertNextNode(LinkList& LTail ,LNode* p, ElemType e) {
if (p == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
if (p == LTail) {
LTail = s;
}
return true;
}
bool InsertPriorNode(LinkList& LTail, LNode* p, ElemType e) {
if (p == NULL || LTail == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
//前插变后插
s->data = p->data;
p->data = e;
s->next = p->next;
p->next = s;
if (p == LTail) {
LTail = s;
}
return true;
}
bool ListDelete(LinkList& LTail, int i, ElemType& e) {
if (i < 1) {
return false;
}
LNode* p = GetElem(LTail, i - 1);
if (p == NULL || p == LTail) {
return false;
}
LNode* s = p->next;
e = s->data;
p->next = s->next;
if (s == LTail) {
LTail = p;
}
free(s);
return true;
}
bool DeleteNode(LinkList& LTail, LNode* p) {
if (p == NULL || LTail == NULL) {
return false;
}
if (p == LTail->next && p->next != p) {
return false;
}
if (p == LTail->next && p->next == p) { //链表只有头节点了
free(LTail);
LTail = NULL;
return true;
}
if (p != LTail) { //判断p是否为尾结点
LNode* s = p->next;
p->data = s->data;
p->next = s->next;
if (s == LTail) {
LTail = p;
}
free(s);
}
else {
LNode* s = LTail;
while (s->next != p) {
s = s->next;
}
s->next = LTail->next;
LTail = s;
free(p);
}
return true;
}
bool InitList(LinkList& LTail) {
LTail = (LNode*)malloc(sizeof(LNode));
if (LTail == NULL) {
return false;
}
LTail->next = LTail;
return true;
}
bool ListTailInsert(LinkList& LTail) {
if (!InitList(LTail)) {
return false;
}
ElemType x;
LNode* s;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = x;
s->next = LTail->next;
LTail->next = s;
LTail = s;
scanf("%d", &x);
}
return true;
}
bool ListHeadInsert(LinkList& LTail) {
if (!InitList(LTail)) {
return false;
}
LNode* s, * head = LTail->next;
ElemType x;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
if (LTail == LTail->next) { //添加第一个结点
LTail = s;
}
s->data = x;
s->next = head->next;
head->next = s;
scanf("%d", &x);
}
return true;
}
void Traverse(LinkList LTail) {
if (LTail == NULL) {
return;
}
LNode* p = LTail->next->next;
while (p != LTail->next) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}