408-王道-循环单链表

1.操作菜单

在这里插入图片描述

2.头插法

  1. 要注意的就是我们的尾部的next指针指向的是头结点,但是我们用的是头插法,我们要保证尾部的next指向头节点,所以我在这用一个计数器来解决这个问题

  2. 监视
    操作
    监视

  3. 代码参考

//头插法
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.尾插法

  1. 尾部的next要指向头结点,所以要一直修改当前尾节点的指向
  2. 监视
    在这里插入图片描述
    在这里插入图片描述
  3. 代码参考
//尾插法 
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.修改元素

  1. 注意里面的size方法和单链表的不一样
  2. 代码参考
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.查找元素

  1. 判断索引是否在合法范围之内
  2. 参考代码
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.遍历元素

  1. 注意循环条件
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值