#include<bits/stdc++.h>
using namespace std;
//带有头节点的单链表
#define ElemType int
struct LNode{ //定义单链表节点类型
ElemType data; //数据元素
LNode *next; //指向下一个节点的指针
};
//初始化链表
void InitList(LNode * &L){
L=(LNode *)malloc(sizeof(LNode)); //为头节点申请空间
if(L==NULL){ //内存不足
cout<<"内存分配失败"<<endl;
return;
}
L->next=NULL; //初始化时头节点之后暂时没有节点
}
//插入节点,在第i个节点处插入数据
void ListInsert(LNode * &L,int i,int value){
if(i<1){
cout<<"插入位置不合法"<<endl;
return;
}
LNode *p=L;
int j=0;
while(p!=NULL&&j<i-1){ //找到要插入位置的前一个节点
p=p->next;
j++;
}
if(p==NULL){ //如果p为空,说明遍历完整个链表未找到前一个节点
cout<<"插入位置不合法"<<endl;
return;
}
LNode *t=(LNode *)malloc(sizeof(LNode)); //为要插入的节点分配空间
if(t==NULL){
cout<<"空间分配失败"<<endl;
return;
}
t->data=value;
t->next=p->next; //插入节点
p->next=t;
cout<<"插入成功"<<endl;
}
//按位删除节点
void ListDelete(LNode * &L,int i){
if(i<1){
cout<<"删除位置不合法"<<endl;
return;
}
LNode *p=L;
int j=0;
while(p!=NULL&&j<i-1){ //找到要删除的节点的前一个节点
p=p->next;
j++;
}
if(p==NULL||p->next==NULL){
cout<<"删除位置不合法"<<endl;
return;
}
LNode *t=p->next;
int value=t->data;
p->next=t->next;
free(t); //释放要删除节点的空间
cout<<value<<"删除成功"<<endl;
}
//按位查找节点
void GetElem(LNode *L,int i){
if(i<1){
cout<<"查找位置不合法"<<endl;
return;
}
LNode *p=L;
int j=0;
while(p!=NULL&&j<i){ //找到要查找的节点
p=p->next;
j++;
}
if(p==NULL){
cout<<"查找位置不合法"<<endl;
return;
}
int value=p->data;
printf("查找成功,第%d个节点元素为:%d\n",i,value);
}
//按位修改节点
void ListUpdate(LNode * &L,int i,int value){
if(i<1){
cout<<"修改位置不合法"<<endl;
return ;
}
LNode *p=L;
int j=0;
while(p!=NULL&&j<i){ //找到要修改的节点
p=p->next;
j++;
}
if(p==NULL){
cout<<"修改位置不合法"<<endl;
return ;
}
p->data=value;
printf("第%d个节点的数据修改为:%d\n",i,value);
}
//遍历链表
void ShowList(LNode * &L){
LNode *T=L->next;
while(T!=NULL){
cout<<T->data<<" ";
T=T->next;
}
cout<<endl;
}
int main(){
LNode *L; //定义一个节点指针
InitList(L); //初始化链表
ListInsert(L,1,5); //插入节点
ListInsert(L,2,3);
ListInsert(L,2,6);
ListInsert(L,3,1);
ListInsert(L,2,8);
ListInsert(L,6,7);
ShowList(L); //遍历链表
ListDelete(L,1); //删除节点
ListDelete(L,9);
ListDelete(L,4);
ShowList(L); //遍历节点
GetElem(L,1); //查找节点
GetElem(L,2);
GetElem(L,9);
ListUpdate(L,1,6); //修改节点
ListUpdate(L,3,5);
ListUpdate(L,8,6);
ShowList(L); //遍历节点
return 0;
}
带有头节点的单链表
最新推荐文章于 2022-12-13 19:13:05 发布