链表的基本操作

/链表的基本操含有对链表的建立,插入,删除,查询,输出等基本操作

/在此特别提醒链表的基础尤为重要,在这里重写此代码能够更加深刻的理解了链表的空间的申请,

/头节点的建立以及头指针的重要和尾节点存在的必要性

/这个源代码以链表的创建为核心,为了怕麻烦就没有进行优化,但是创建和输出是这个代码的核心。

/希望这个能帮助到初学者,在这有不懂得地方可以看我的随笔,链表的整表的创建,那里有更加详细的介绍

/在此附上图:

一、初始化界面

二、创建链表

三、输出所创建的链表中元素

源代码:

//先建立一个完整的链表,然后对其进行增删改查
//在这里我们采用尾插入的方式来对其进行建立链表

#include <iostream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
typedef int DataType;
//声明节点 
typedef struct node{
DataType data;
struct node *next;
}SLNode;


//创建头指针
SLNode *InitiateHead(SLNode*phead){
phead = (SLNode*)malloc(sizeof(SLNode));
phead->next = NULL;
return phead;
} 


//创建链表 
SLNode * Create_List(SLNode *head){//头节点开始的申请空间 
SLNode *r,*p;
int x;
char c ;
if(head !=NULL){
free(head);
head = NULL; 
}
head = (SLNode*)malloc(sizeof(SLNode));
head->data=x;
if(head !=NULL){
r = head;
cout<<"空间成功申请!"<<endl; 
}
cout<<"创建链表:"<<endl; 
while(c !=NULL||c!='n'){
cout<<"请输入:";cin>>x;
p = (SLNode*)malloc(sizeof(SLNode));
p->data = x;
r->next = p;
r = p;
cout<<"是否继续输入:Y/N"<<endl;
cin>>c;
if(c == 'Y'||c == 'y'){
continue;
}else{
r->next= NULL;
cout<<"首地址1:"<<head<<endl;/// 
cout<<"链表创建完成!"<<endl; 
return head; 
} 

} 
}


//链表的插入
int ListInsert(SLNode *head,int i ,DataType x){
SLNode *p,*q;
p = head->next;
int j = 0; 
while(p->next!= NULL && j < i-1){
p = p->next;
j++;
}
if(j != i -1){
cout<<"插入位置参数错误!"<<endl;
return 0;
}
q = (SLNode *)malloc(sizeof(SLNode));
q->data= x;
q->next= p->next;
p->next = q;
cout<<"插入成功 !"<<endl;
return 1; 
} 


//链表的删除
int ListDelete(SLNode *head,int i ,DataType *x){
SLNode *p ,*s;
int j;
p = head->next;
j = 0;
while( p ->next !=NULL && j<i -1){
p = p->next;
j++; 
}
if(j != i -1){
cout <<"删除位置参数错误!"<<endl;
return 0; 
}
s = p->next;
*x = s->data;
p->next = p->next->next;
free(s);
cout<<"删除成功!"<<endl; 
return 1;
}


//查询获取元素
int ListGet(SLNode *head,int i ,DataType *x){
SLNode *p ;
int j;
p = head->next;
j = 0;
while(p->next!= NULL &&j <i){
p = p->next;
j++;

}
if(j != i){
cout<<"取元素 位置参数错误!"<<endl;
return 0; 
}
*x = p->data;
cout<<"查找成功!"<<endl;
return 1; 

}

//链表的输出
void OutPut_List(SLNode *phead){
SLNode *p;
// cout<<"首地址3:"<<phead<<endl;/// 
//cout<<"首地址4:"<<phead->next<<endl;
p = phead->next->next;
//cout<<"data:"<<p->data<<endl;
int i = 1;
while(p!=NULL){
cout<<"第"<<i<<"一个元素:"<<p->data<<endl;
i++;
p = p->next;
} 
}


//释放内存,避免内存的泄漏

void Destroy(SLNode *head){
SLNode *p = head ;
SLNode *p1;
while(p != NULL){

p1 = p;
p = p->next;
free(p1);

}
head = NULL;

cout<<"释放内存成功!"<<endl; 

}

//菜单

void menu(){
cout<<"_________________________________________________________"<<endl;
cout<<"|*******************************************************|"<<endl;
cout<<"|*****************欢迎进入菜单选项*.********************|"<<endl;
cout<<"|*****************进入初始化阶段请稍后....**************|"<<endl;
cout<<"|*****************0、清屏 **************|"<<endl;
cout<<"|*****************1、创建链表 **************|"<<endl;
cout<<"|*****************2、输出链表 **************|"<<endl;
cout<<"|*****************3、链表的插入 **************|"<<endl;
cout<<"|*****************4、链表的删除 **************|"<<endl;
cout<<"|*****************5、链表的查询 **************|"<<endl;
cout<<"|*****************6、释放内存空间 **************|"<<endl;
cout<<"|*******************************************************|"<<endl;
cout<<"_________________________________________________________"<<endl;
}

//switch 操作
void operation(SLNode *phead){
SLNode *p,*p1;
int n,i;
int input;
cout<<"请选择:"<<endl;
cin>>input;
//p1=InitiateHead(phead);//头指针 
switch(input){
case 0:system("CLS");menu();operation(phead);
case 1:p1=Create_List(p);
/* cout<<"首地址2:"<<p1<<endl;//此为创建链表后返回的头节点的地址,头节点不存任何东西*/ 
phead->next=p1; phead->next=p1;menu();operation(phead); break;
case 2:cout<<"输出已创建好的链表中的数据:"<<endl;OutPut_List(phead);menu();operation(phead);break;
case 3:cout<<"请输入要插入的元素:";cin>>n;cout<<endl;cout<<"请输入要插入的位置";cin>>i; 
ListInsert(phead,i ,n);menu();operation(phead);menu();operation(phead);break;
case 4:cout<<"请输入要删除的元素:";cin>>n;cout<<endl;cout<<"请输入要删除的位置";cin>>i; 
ListDelete(phead,i ,&n);menu();operation(phead);menu();operation(phead);break;
case 5:cout<<"请输入要查询的元素:";cin>>n;cout<<endl;cout<<"请输入要查询的位置";cin>>i; 
ListGet(phead,i ,&n);menu();operation(phead);menu();operation(phead);break;
case 6:cout<<"释放存储空间:"; Destroy(phead);break;
default :cout<<"请重新选择!"<<endl; menu();operation(phead);

} 
}
//主函数

int main(){
SLNode *phead;
phead=InitiateHead(phead);
cout<<"首地址2.1:"<<phead<<endl;//此为头指针的地址 
menu();
operation(phead);

return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值