🎃Hello,大家好,今天我们要做的是单链表的基本操作。
目录
🎐2、从键盘上依次输入21、18、30、75、42、56,尾插法创建单链表,并输出单链表中的各元素值。
🎐3.分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。
🎐4.删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。
🎯目的:
1、掌握线性链表的操作特点,即指针是逻辑关系的映像。
2、掌握动态产生单链表的方法。
3、熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。
4、熟练掌握单链表的取元素操作。
🎯内容:
1、定义单链表类型并动态创建单链表;
2、实现线性表链式存储结构下元素的插入操作;
3、实现线性表链式存储结构下元素的删除操作;
4、实现线性表链式存储结构下取元素操作。
🎯环境:
TC或VC++。
🎯步骤:
🎐1.单链表的存储定义
typedef struct LNode
{
ElemType data; // 数据域
struct LNode *next; // 指针域
} LNode, *LinkList;
🎐2、从键盘上依次输入21、18、30、75、42、56,尾插法创建单链表,并输出单链表中的各元素值。
🎐3.分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。
🎐4.删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。
🎐5.取单链表中的第5个数据元素和第7个数据元素。
🎯完整代码:
#include "iostream"
#define OK 1;
#define ERROR 0;
typedef int Status;
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L){//创建单链表
L=new LNode;//生成头节点
L->next=NULL;//使头结点指向为空
return OK;
}
void GreateList_L(LinkList &L,int n){//链表的初始化
LNode *p,*r;
r=L;
cout<<"你要输入几个数:";
cin>>n;
cout<<"请输入您要输入的数:"<<endl;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
Status GetElem(LinkList L,int i,int &e){//链表的取值
LNode *p;
p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i)return ERROR;
e=p->data;
printf("第%d个结点的值是%d\n",i,e);
return OK;
}
LNode *LocateElem(LinkList L,int e){//链表的查找
LNode *p;
p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
Status ListINsert(LinkList &L,int i,int e){//链表的插入
LNode *p,*s;
p=L;int j=0;
while(p&&(j<i-1)){
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList &L,int i){//链表的删除
LNode *p,*q;
p=L;
int j=0;
while((p->next)&&(j<i-1)){
p=p->next;
j++;
}
if(!(p->next)||(j>i-1))
return ERROR;
q=new LNode;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
void OutLinkList(LinkList L){//链表的输出
LNode *p;
p=L->next;
printf("链表中的值为:\n");
while(p){
printf("%-4d",p->data);
p=p->next;
}
printf("\n");
}
void GreateList_G(LinkList &L){//链表的求逆
LNode *p,*q;
p=L->next;
L->next=NULL;
while(p){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
int main(){
printf("1.创建\n2.初始化\n3.取值\n4.查找\n5.插入\n6.删除\n7.求逆\n0.退出\n-----------------------------\n");
LinkList L;
int f=1;
int i,n,e,choose;
while(f){
printf("请输入您的选择:");
cin>>choose;
switch(choose){
case 1:
InitList(L);
printf("恭喜您,链表创建成功!\n");
break;
case 2:
GreateList_L(L,n);
printf("初始化成功\n");
OutLinkList(L);
break;
case 3:
printf("请输入您要取值的位置:");
cin>>i;
if(GetElem(L,i,e))
printf("取值成功\n");
else
printf("取值失败\n");
break;
case 4:
printf("请输入您要查找的值:");
cin>>e;
if(LocateElem(L,e))
printf("查找成功!\n");
else
printf("查找失败!\n");
break;
case 5:
printf("请输入您要插入的位置和数值:");
cin>>i>>e;
if(ListINsert(L,i,e)==1)
printf("插入成功\n");
else
printf("插入失败\n");
OutLinkList(L);
break;
case 6:
printf("请输您要删除的位置:");
cin>>i;
if(ListDelete(L,i)==1)
printf("删除成功\n");
else
printf("删除失败\n");
OutLinkList(L);
break;
case 7:
GreateList_G(L);
OutLinkList(L);
break;
case 0:
f=0;
printf("恭喜您,已退出\n");
break;
}
}
return 0;
}
🎃以上是本期的所有内容了,请大佬多多在评论区指正!
🌞我是IT闫,期待你的关注!!!❤️