2021-09-28单链表

单链表

单链表的定义,初始化,增删改查操作

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
	int node;
	LNode *next;
}LNode, *Linklist;

//初始化单链表并将数组元素导入单链表
void InitList(Linklist &L,int a[6]) {
	L = (LNode*)malloc(sizeof(LNode));
	L->next=NULL;
	//尾插法插入元素
	LNode* p;
	LNode* rear = L;
	for (int i = 0;i < 6;i++) {
		p = (LNode*)malloc(sizeof(LNode));
		p->node = a[i];
		p->next = rear->next;
		rear->next = p;
		rear = rear->next;
	}
};

//头插法插入元素
void AddElem(Linklist &L) {
	int data;
	LNode *p;
	printf("请输入您想插入的数据(输入1终止插入数据):");
	scanf_s("%d", &data);
	while (data != 1) {
		p = (LNode*)malloc(sizeof(LNode));
		p->node = data;
		p->next = L->next;
		L->next = p;
		printf("插入成功,请继续输入(输入1终止插入数据):");
		scanf_s("%d",&data);
	}

}

//打印单链表
void PrintfList(Linklist L) {
	LNode* p = L;
	int count= 0;
	while (p->next) {
		count++;
		p = p->next;
		printf("第%d个节点为:%d\n",count,p->node);
	}
}

//按位查找
LNode* GetElem(Linklist L,int &i) {
	LNode* p = L;
	int count = 0;
	int index;
	if (i != -1) {
		index = i;
	}
	else {
		printf("请输入您想查找元素的位置:");
		scanf_s("%d", &index);
		//验证查找的位置是否为有效值(是否越界)
		i = index;
	}
	while (count < index) {
		p = p->next;
		count++;
	}
	return p;
}

//按值查找元素,返回元素和元素所在位置
LNode* LocateElem(Linklist L, int &data) {
	//定义一个指针P,用于遍历单链表
	LNode* p = L;
	//定义变量i,用于记录元素的位置
	int i = 0;
	//逐个遍历链表节点,并将节点的值与data进行比较,如果相同则返回此节点,如果不同则移动指针到下一个元素,直到遍历结束
	while (p->next) {
		p = p->next;
		i++;
		if (p->node == data) {
			data = i;
			return p;
		}
	}
	//没有找到对应的值则返回空。
	return NULL;
}

//按位删除元素,并返回被删除的元素
LNode* DelElem(Linklist &L,int index) {
	//定义指针P用于保存被删除的元素
	LNode* p,* preNode;
	int pre = index - 1;
	//按位查找index的前驱节点
	preNode=GetElem(L, pre);
	//保存被删除的节点
	p = preNode->next;
	//删除节点并返回
	preNode->next = p->next;
	printf("删除成功\n");
	return p;
}
//按值删除元素

//按值修改元素的值
void UpdateElem(Linklist &L,int oldData,int newData) {
	//按值查找节点,修改该节点的node值
	LocateElem(L, oldData)->node=newData;
}
void main(){
	int a[6] = { 45,76,94,77,963,16 };
	Linklist L;//创建一个带头节点的单链表
	InitList(L,a);//单链表初始化
	AddElem(L);//添加元素
	PrintfList(L);//遍历、打印单链表
	int i=-1;
	printf("第%d个元素的值为:%d\n",i,GetElem(L,i)->node);//按位查找第i个元素的值
	//按值查找对应元素的位置
	int data=0;
	printf("请输入您想查找元素的值:");
	scanf_s("%d", &data);
	int temp = data;
	printf("值为%d的元素",data);//按位查找第i个元素的值
	LocateElem(L, data);
	if (data != temp)
		printf("在第%d位\n", data);//按位查找第i个元素的值
	else
		printf("您行搜索的值不在单链表中");
		printf("值为%d的元素",data);//按位查找第i个元素的值
	LocateElem(L, data);
	int index1 = 0;
	printf("请输入您想删除的元素所在的位置:");
	scanf_s("%d", &index1);
	DelElem(L, index1);//删除第i个位置的节点
	PrintfList(L);//遍历、打印单链表
	int oldData = 0;
	printf("请输入原数据值:");
	scanf_s("%d", &oldData);
	int newData = 0;
	printf("请输入新数据值:");
	scanf_s("%d", &newData);
	UpdateElem(L, oldData, newData);
	PrintfList(L);//遍历、打印单链表
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值