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

  1. 链表c语言实现

    链表(c语言实现)--------------小练习   #include <stdio.h> #include <stdlib.h> #include <string. ...

  2. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  3. C链表-C语言入门经典例题

    struct student { long num; float score; struct student *next; }; 注意:只是定义了一个struct student类型,并未实际分配存储 ...

  4. 数据结构之链表C语言实现以及使用场景分析

    牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...

  5. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

  6. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  7. (续)顺序表之单循环链表(C语言实现)

    单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...

  8. 静态链表C语言数据结构

    静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...

  9. 约瑟夫环问题 --链表 C语言

    总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...

随机推荐

  1. [Java] Java中List 去掉重复的值,并保持原先List顺序

    private List<YourBean> removeDuplicate(List<YourBean> list) { Set<YourBean> set = ...

  2. CentOS所有下载

    简述 CentOS(Community Enterprise Operating System - 社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux ...

  3. mysql关于编码部分(乱码出现的原因和解决方法)

    在使用mysql客户端时,我们会经常出现一个这样一个问题,就是原先好好文字,怎么输入之后就出现乱码了呢? 出现这样的问题: 第一个原因: 可能是这是我们新安装的一个mysql,没有经过配置,第二个原因 ...

  4. 10大html5前端框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  5. IE5,IE6,IE7,IE8的css兼容性列表[转自MSDN]

    CSS 2.1:   IE 5.0 IE 5.5 IE 6.0 IE 7.0 IE8 Beta 1 IE8 Beta 2 IE 8.0 @charset No Yes Yes Yes Yes Yes ...

  6. oracle错误码

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  7. lucene索引文件格式

    转自:http://blog.csdn.net/whuqin 本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含 ...

  8. spring的依赖注入DI(IOC)

    1.手动注入 (1)set注入 public class UserService { private UserDao userDao; public void setUserDao(UserDao d ...

  9. ViewPager滑动页面的实现方法

    package com.lixu.pagerview; import java.util.ArrayList; import android.app.Activity; import android. ...

  10. [Js]缓冲运动

    一.运动框架 1.在开始运动时,关闭已有定时器(否则会不断有新的定时器执行) 2.把运动和停止隔开(if/else) 二.缓冲运动 逐渐变慢,最后停止(距离越远速度越大) 速度=(目标值-当前值)/缩 ...