单链表
单链表的定义,初始化,增删改查操作
#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);//遍历、打印单链表
}