链表数据结构(C/C++语言实现)
注意:没有使用malloc和free;加了一个头文件,用于清屏和暂停;还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间。一定要先初始化链表再建立。以下代码说白了就是一个个的函数堆出来的,只是要注意函数的参数有时候有引用符&,有时候没有,我总结了一个便于记忆的小技巧:如果你想要对链表做出任何改变,请一定加上&;如果你对链表不想做出改变,就可以不用加,无论你加还是不加,为了保险,可以都加上。如果擅长用指针的话,就忽略从此段话!!!!!
#include<iostream>
#include<cstdlib>
using namespace std; struct LNode{
int data;
LNode* next;
};
typedef LNode *LinkList; //函数声明
void show();
void InitList(LinkList &L);
int CreateList(LinkList &L,int n);
int InsertList(LinkList &L,int index,int e);
string GetElem(LinkList L,int index,int &e);
int deleteList(LinkList &L,int index,int &e);
void PrintList(LinkList L); int main(){
int action,length,index,result,e;
string res;
LinkList L;
show();
while(cin>>action){
switch(action){ case 1://初始化链表
system("cls");
InitList(L);
break; case 2://建立链表
system("cls");
cout<<"请输入链表的长度:"<<endl;
cin>>length;
result=CreateList(L,length);
if(!result){
cout<<"创建链表失败!"<<endl;
} else {
cout<<"创建链表成功!"<<endl;
}
break; case 3://向链表中插入数据
system("cls");
cout<<"请输入想要插入的位置和插入元素的值:"<<endl;
cin>>index>>e;
InsertList(L,index,e);
break; case 4://获取索引为index的元素值
system("cls");
cout<<"请输入索引:"<<endl;
cin>>index;
res=GetElem(L,index,e);
if(res=="yes"){
cout<<"第"<<index<<"个数是"<<e<<endl;
} else {
cout<<"未找到该索引的值"<<endl;
}
break; case 5://删除索引为index的值
system("cls");
cout<<"请输入想要删除的数的索引:"<<endl;
cin>>index;
deleteList(L,index,e);
cout<<"第"<<index<<"个元素已经被删除!"<<endl;
break; case 6://打印链表
system("cls");
cout<<"链表内容为:"<<endl;
PrintList(L);
break; case 7://退出
return 0;
}
system("pause");//暂停
system("cls");//清屏
show();
}
} //主界面
void show(){
cout<<"+----------------------------------------+"<<endl;
cout<<"| |"<<endl;
cout<<"| 1->初始化链表 |"<<endl;
cout<<"| 2->创建链表 |"<<endl;
cout<<"| 3->插入结点 |"<<endl;
cout<<"| 4->查找结点 |"<<endl;
cout<<"| 5->删除节点 |"<<endl;
cout<<"| 6->打印链表 |"<<endl;
cout<<"| 7->退出 |"<<endl;
cout<<"| |"<<endl;
cout<<"+----------------------------------------+"<<endl;
} //初始化链表
void InitList(LinkList &L){
L=new LNode;
cout<<"链表初始化成功!"<<endl;
} //创建链表
//尾插法,最先进入的元素在最末尾
//int CreateList(LinkList &L,int n){
// cout<<"请依次输入结点的值:"<<endl;
// L->next=NULL;
// int i;
// for(i=0;i<n;i++){
// LinkList p=new LNode;
// cin>>p->data;
// p->next=L->next;
// L->next=p;
// }
// if(i!=n){
// return 0;//失败
// } else {
// return 1;//成功
// }
//} //正序创建,按照输入顺序存储
int CreateList(LinkList &L,int length){
cout<<"请依次输入结点的值:"<<endl;
LinkList p,q;
L->next=NULL;
p=L;
for(int i=0,x;i<length;i++){
LinkList q=new LNode;
cin>>x;
q->data=x;
p->next=q;
p=p->next;
}
p->next=NULL;
return 1;
} //获取第i个结点的值
string GetElem(LinkList L,int i,int &e){
LinkList p;
p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i){
return "no";//未找到
} else {
e=p->data;
return "yes";//找到
}
} //将值为e的结点插入到第i个位置
int InsertList(LinkList &L,int i,int e){
LinkList p;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1){
return 0; //失败
} else {
LinkList s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;//成功
}
} //删除第i个结点,并将结点的值保存到e中
int deleteList(LinkList &L,int i,int &e){
LinkList p,q;
p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)&&j>i-1){
return 0;
}
q=p->next;
p->next=q->next;
e=q->data;
delete q;//释放q结点,节约空间
return e;
} //打印链表
void PrintList(LinkList L){
LinkList p;
p=L;
while(p->next){
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
链表数据结构(C/C++语言实现)的更多相关文章
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 数据结构的C语言基础
数据结构的C语言基础 1. 数据输出 printf()函数为格式输出函数,它存在于标准函数库中,在C语言程序中可以直接调用,但程序源文件的开头必须包含以下命令: #include < stdi ...
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现
一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...
- 数据结构算法C语言实现(十)--- 3.3栈与递归的实现
一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...
随机推荐
- sys.argv[]使用
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得的参数可以是多个,所以获得的是一 ...
- 用Python读写Excel文件的方式比较
虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Ex ...
- [USACO09JAN]安全出行Safe Travel
题目 什么神仙题啊,我怎么只会\(dsu\)啊 我们考虑一个非常暴力的操作,我们利用\(dsu\ on \ tree\)把一棵子树内部的非树边都搞出来,用一个堆来存储 我们从堆顶开始暴力所有的边,如果 ...
- Vue:渲染、指令、事件、组件、Props
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要的工 ...
- spring的@Transaction使用注意
文章参考资料 https://www.cnblogs.com/andy-zhou/p/5317866.html http://labreeze.iteye.com/blog/2277261 Sprin ...
- Jquery弹窗组件
下面是写的简单的Jquery弹窗组件 暂不支持animate,只能满足一般的弹窗显示隐藏需求,更多功能后续会完善!网上及jquery组件很多这样的弹窗,但是用别人的感觉心里过不去,所以就随便写写,当做 ...
- 2018-2019-2 20175105王鑫浩 实验二《Java面向对象程序设计》实验报告
一.实验步骤 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装,继承,多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 二.实验内容 (一).单元测试 1 ...
- Omi框架学习之旅 - 插件机制之omi-transform及原理说明
给omi-transform插件做个笔记,使用起来也很爽. transform.js这个库,一直想写一篇帖子的,可是,数学不好,三维矩阵和二位矩阵理解的不好,所以迟迟没写了, 这也是一个神库,反正我很 ...
- iRedMail退信问题的解决(转)
安装完iRedMail之后发现可以给外网发邮件但是收不到外网发来的邮件,查看log发现这么一句话:postfix/postscreen[11355]: NOQUEUE: reject: RCPT fr ...
- 关于x210开发板和主机、虚拟机ping通问题
关于x210开发板和主机.虚拟机ping通问题: 步骤: 1.关闭 Ubuntu.关闭VMware软件: 2.打开 网络连接,设置 以太网 IP地址,并确认使用的网卡 3.以管理员身份打开VMware ...