1.操作菜单
2.头插法
-
要注意的就是我们的尾部的next指针指向的是头结点,但是我们用的是头插法,我们要保证尾部的next指向头节点,所以我在这用一个计数器来解决这个问题
-
监视
-
代码参考
//头插法
void insertHead(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
L->nextNode = NULL;
LinkList temp;
ElemType data;
int count = 0;
scanf("%d", &data);
while (data != 999) {
count++;
temp = (LinkList)malloc(sizeof(LNode));
temp->data = data;
if (count == 1) {
L->nextNode = temp;
temp->nextNode = L;
}
else {
temp->nextNode = L->nextNode;
L->nextNode = temp;
}
scanf("%d", &data);
}
return;
}
2.尾插法
- 尾部的next要指向头结点,所以要一直修改当前尾节点的指向
- 监视
- 代码参考
//尾插法
void insertEnd(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
ElemType data;
LinkList temp;
LinkList end = L;
scanf("%d", &data);
while (data != 999) {
temp = (LinkList)malloc(sizeof(LNode));
temp->data = data;
temp->nextNode = L;
end->nextNode = temp;
end = temp;
scanf("%d", &data);
}
}
3.修改元素
- 注意里面的size方法和单链表的不一样
- 代码参考
bool modifyNode(LinkList& L, int index, ElemType data) {
LinkList temp = (LinkList)malloc(sizeof(LNode));
int count = 0;
temp = L->nextNode;
if (index<1 || index>size(L)) {
return false;
}
while (temp != NULL) {
count++;
if (count == index) {
temp->data = data;
return true;
}
else {
temp = temp->nextNode;
}
}
return false;
}
4.查找元素
- 判断索引是否在合法范围之内
- 参考代码
LinkList location(LinkList L, int index) {
int count = 0;
LinkList temp = L->nextNode;
if (index<1 || index>size(L)) {
return NULL;
}
while (temp != NULL) {
count++;
if (count == index) {
return temp;
}
temp = temp->nextNode;
}
return NULL;
}
5.删除元素
//这块代码写的不简便
bool deleteNode(LinkList L, int index) {
if (index<1 || index>size(L)) {
return false;
}
else {
//第一个结点
if (index == 1 && size(L) == 1) {
LinkList deleteNode = L->nextNode;
L->nextNode = L->nextNode->nextNode;
deleteNode->nextNode = NULL;
free(deleteNode);
L->nextNode = L;
return true;
}
else if (index == 1 &&size(L)!=1) {
LinkList deleteNode = L->nextNode;
L->nextNode = L->nextNode->nextNode;
deleteNode->nextNode = NULL;
free(deleteNode);
return true;
}
//最后一个结点
else if (index == size(L)) {
LinkList parentNode = searchParent(L, index - 1);
parentNode->nextNode = NULL;
free(parentNode->nextNode);
parentNode->nextNode = L;
return true;
}
//不是头和尾结点的结点
else {
LinkList parentNode = searchParent(L, index - 1);
parentNode->nextNode = parentNode->nextNode->nextNode;
return true;
}
}
}
6.遍历元素
- 注意循环条件
void printLinkList(LinkList L) {
LinkList temp = L->nextNode;
while (temp!=L) {
printf("%3d\n", temp->data);
temp = temp->nextNode;
}
}
7.长度
int size(LinkList L) {
int count = 0;
LinkList temp = L->nextNode;
while (temp!= L) {
count++;
temp = temp->nextNode;
}
return count;
}
8.汇总
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
/*
1.头插法
2.尾插法
3.修改
4.查找
5.删除
6.遍历
*/
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* nextNode;
}LNode, * LinkList;
void insertHead(LinkList& L);
void insertEnd(LinkList& L);
void printLinkList(LinkList L);
int size(LinkList L);
void menu(LinkList& L);
void choice(LinkList& L);
LinkList searchParent(LinkList& L, int index);
//头插法
void insertHead(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
L->nextNode = NULL;
LinkList temp;
ElemType data;
int count = 0;
scanf("%d", &data);
while (data != 999) {
count++;
temp = (LinkList)malloc(sizeof(LNode));
temp->data = data;
if (count == 1) {
L->nextNode = temp;
temp->nextNode = L;
}
else {
temp->nextNode = L->nextNode;
L->nextNode = temp;
}
scanf("%d", &data);
}
return;
}
//尾插法
void insertEnd(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
ElemType data;
LinkList temp;
LinkList end = L;
scanf("%d", &data);
while (data != 999) {
temp = (LinkList)malloc(sizeof(LNode));
temp->data = data;
temp->nextNode = L;
end->nextNode = temp;
end = temp;
scanf("%d", &data);
}
}
//修改
bool modifyNode(LinkList& L, int index, ElemType data) {
LinkList temp = (LinkList)malloc(sizeof(LNode));
int count = 0;
temp = L->nextNode;
if (index<1 || index>size(L)) {
return false;
}
while (temp != NULL) {
count++;
if (count == index) {
temp->data = data;
return true;
}
else {
temp = temp->nextNode;
}
}
return false;
}
LinkList searchParent(LinkList& L, int index) {
int count = 0;
LinkList temp = L->nextNode;
if (index == 0) {
return L;
}
while (temp != NULL) {
count++;
if (index == count) {
return temp;
}
else {
temp = temp->nextNode;
}
}
}
//查找
LinkList location(LinkList L, int index) {
int count = 0;
LinkList temp = L->nextNode;
if (index<1 || index>size(L)) {
return NULL;
}
while (temp != NULL) {
count++;
if (count == index) {
return temp;
}
temp = temp->nextNode;
}
return NULL;
}
//删除
bool deleteNode(LinkList L, int index) {
if (index<1 || index>size(L)) {
return false;
}
else {
//第一个结点
if (index == 1 && size(L) == 1) {
LinkList deleteNode = L->nextNode;
L->nextNode = L->nextNode->nextNode;
deleteNode->nextNode = NULL;
free(deleteNode);
L->nextNode = L;
return true;
}
else if (index == 1 &&size(L)!=1) {
LinkList deleteNode = L->nextNode;
L->nextNode = L->nextNode->nextNode;
deleteNode->nextNode = NULL;
free(deleteNode);
return true;
}
//最后一个结点
else if (index == size(L)) {
LinkList parentNode = searchParent(L, index - 1);
parentNode->nextNode = NULL;
free(parentNode->nextNode);
parentNode->nextNode = L;
return true;
}
//不是头和尾结点的结点
else {
LinkList parentNode = searchParent(L, index - 1);
parentNode->nextNode = parentNode->nextNode->nextNode;
return true;
}
}
}
//遍历
void printLinkList(LinkList L) {
LinkList temp = L->nextNode;
while (temp!=L) {
printf("%3d\n", temp->data);
temp = temp->nextNode;
}
}
int size(LinkList L) {
int count = 0;
LinkList temp = L->nextNode;
while (temp!= L) {
count++;
temp = temp->nextNode;
}
return count;
}
void menu(LinkList& L) {
printf("----------------循环单链表---------------\n");
printf(" 1.头插法 \n");
printf(" 2.尾插法 \n");
printf(" 3.修改元素 \n");
printf(" 4.查找元素 \n");
printf(" 5.删除元素 \n");
printf(" 6.遍历元素 \n");
printf(" 7.链表长度 \n");
choice(L);
}
void choice(LinkList& L) {
int choice;
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
insertHead(L);
break;
case 2:
insertEnd(L);
break;
case 3: {
int index;
ElemType data;
printf("请输入你要修改的位置:");
scanf("%d", &index);
printf("请输入待修改的值为:");
scanf("%d", &data);
bool modify = modifyNode(L, index, data);
if (modify) {
printf("修改成功\n");
}
else {
printf("修改失败\n");
}
break;
}
case 4: {
int index;
printf("请输入你要查找的序号:");
scanf("%d", &index);
LinkList locationed = location(L, index);
if (NULL != locationed) {
printf("查找成功 元素为%d\n", locationed->data);
}
else {
printf("查找失败\n");
}
break;
}
case 5: {
int index;
printf("请输入你要删除的元素序号:");
scanf("%d", &index);
bool deleted = deleteNode(L, index);
if (deleted) {
printf("删除成功\n");
}
else {
printf("删除失败\n");
}
break;
}
case 6:
printLinkList(L);
break;
case 7: {
int len = size(L);
printf("长度为%d\n", len);
break;
}
default:
break;
}
menu(L);
}
int main() {
LinkList L;
menu(L);
return 0;
}