注意:没有使用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++语言实现)的更多相关文章

  1. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

  2. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  3. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  4. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  5. 数据结构的C语言基础

    数据结构的C语言基础 1. 数据输出 printf()函数为格式输出函数,它存在于标准函数库中,在C语言程序中可以直接调用,但程序源文件的开头必须包含以下命令: #include < stdi ...

  6. 数据结构算法C语言实现(二十七)--- 7.2图的遍历

    一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...

  7. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  8. 数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

    一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...

  9. 数据结构算法C语言实现(十)--- 3.3栈与递归的实现

    一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...

随机推荐

  1. Django urls 路由

    写url和视图的的对应关系 from django.conf.urls import url from django.contrib import admin from app名 import vie ...

  2. Django之ORM查询进阶

    基于双下划线的双表查询 分组与聚合函数 基于双下划线的双表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询, ...

  3. XML Namespace (xmlns) 属性

    http://www.w3school.com.cn/xml/xml_namespaces.asp XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并 ...

  4. vs2008内存泄露检測得到完美解决

    版权声明:原创文章.转载请注明出处.本博新地址www.iaccepted.net https://blog.csdn.net/IAccepted/article/details/27646679 Vi ...

  5. $Matrix-Tree$定理-题目

    $Matrix-Tree$ 其实矩阵树的题挺好玩的,一些是套班子求答案的,也有一些题目是靠观察基尔霍夫矩阵性质推式子的. 文艺计算姬:https://www.lydsy.com/JudgeOnline ...

  6. 数位dp小练

    最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一 ...

  7. matlab padarray函数

    1 padarray功能:填充图像或填充数组.用法:B = padarray(A,padsize,padval,direction)      A为输入图像,B为填充后的图像, padsize给出了给 ...

  8. Omi框架学习之旅 - 通过omi-id来实现组件通讯 及原理说明

    这个demo是通过omi-id来获取子类的实例,然后更改data属性,之后updata一下就好了. 老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. class Hello ...

  9. linux中断源码分析 - 概述(一)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 关于中断和异常 一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方.在CPU里,中断 ...

  10. java中使用jxl读取excel中的数据

    package bboss; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impo ...