代码,用c++实现线性链表
#include <iostream>
#include <stdio.h>
#include <malloc.h>
using namespace std;
#define INITIALSIZE 10 // 线性表存储空间的分配量,即数组长度
#define Status int //定义返回状态
#define OK 1
#define error 0
//#define LISTINCREMENT=10;
typedef struct {
int * elem; //定义数组
int length; // 当前长度 ,线性表的元素个数,并不是数组长度
int listsize; //数组的长度
} SqList; // 俗称 顺序表
Status InitList(SqList *L);
Status ListEmpty(SqList *L);
int ListLength(SqList *L);
int getElem(SqList *L,int i);//返回i的元素
int locateElem(SqList *L,int e);//返元素的位置
Status ListInsert(SqList *L,int i,int e);
int ListDelete(SqList *L,int i);//删除第i个元素返回这个元素
void Traverse(SqList *L);//遍历列表
Status InitList(SqList * L){
L->elem=(int *)malloc(sizeof(int)*INITIALSIZE);
if (!L->elem){cout<<"分配失败"<<endl;exit(-1);}
L->length=0;
L->listsize=INITIALSIZE;
return OK;
}
Status ListEmpty(SqList * L){
if (L->length==0)return OK;
}
int ListLength(SqList * L){return L->length;}
Status ListInsert(SqList * L,int i,int e){
if (i<1||i>L->length+1){cout<<"赋值失败"<<endl;return error;}//如果输入的下表不足1,或者大于数组的长度,就返回错误
if (L->length>=L->listsize){
int * newbase=(int *)realloc(L->elem,sizeof(int)*((L->listsize<<2)+L->listsize));
if (!newbase)return error;
L->elem=newbase;
L->listsize+=(L->listsize<<2);
}
int * q=&(L->elem[i-1]);//插入位置
for(int * p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return OK;
}
void Traverse(SqList * L){
for (int i=0;i<L->length;++i){
cout<<L->elem[i]<<" ";
}
}
int getElem(SqList *L,int i){
if (i<1||i>L->length)return error;
return L->elem[i];
}
int locateElem(SqList *L,int e){
// int *p = L;
// for (int * q=L->elem[L->length-1];q>p;++q){
// if (*q==e)return
// }
for (int i=0;i<L->length;i++){
if (L->elem[i]==e)return i;
}
return -1;
}
int ListDelete(SqList *L,int i){
if (i<1||i>L->length+1){cout<<"树枝不对"<<endl;return error;}
//删除的位置 删除之后依次前移
for (int * q=&(L->elem[i+1]);q<&(L->elem[L->length-1]);q++){
*(q-1)=*q;
}
--L->length;
return OK;
}
int main(){
SqList mm;
if (InitList(&mm)){
for (int i=1;i<=30;i++){
ListInsert(&mm,i,i);
}
Traverse(&mm);
ListDelete(&mm,2);
cout<<endl<<"删除之后"<<mm.length<<endl;
Traverse(&mm);
cout<<endl<<mm.elem[2]<<endl;
cout<<locateElem(&mm,12);
};
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
代码,用c++实现线性链表的更多相关文章
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- javascript实现数据结构与算法系列:功能完整的线性链表
由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...
- select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)
一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
- python算法:LinkedList(双向线性链表)的实现
LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一 ...
- C代码实现非循环单链表
C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...
- 线性链表的双向链表——java实现
.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...
- 【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)
二叉树存储结构属于非线性链表结构,转化成线性链表结构,能简化操作和理解.然而由非线性转线性需要对整个树遍历一次,不同的遍历方式转化结果页不一样.下面以先序为例. 方法一: 递归法.递归遍历二叉树,因为 ...
- [C++]线性链表之单链表
[文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...
随机推荐
- shiro3
1 shiro介绍 1.1 什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi ...
- 什么是gitlab CI ?CI代表什么?
CI是Continuous Integration的简称,就是持续集成的意思. 就是说你代码改动了,测试了,提交了,持续集成系统会自动构建(编译等等).持续集成的理念是每个提交的版本都应该是可交付的, ...
- android HDMI (一):HDMI基础篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7713450 说到android的HDMI,从android 2.2.android2. ...
- Linux 创建Bridge
安装Bridge工具软件包 Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令: yum install bridge-utils 或 apt-get install b ...
- centos web+mysql服务器的安全
今天闲来无事,拿来X-Scan-v3.3 来扫描自己的服务器,开放端口有22,80,443,3306:3306端口被扫出来,呵呵,那可不得了: 一,屏蔽扫描器扫出3306端口,因为web和数据库是在同 ...
- Zookeeper简单配置
1.配置zookeeper 解压tar包后,在conf目录下,有一个zoo_sample.cfg,拷贝一份并命名为zoo.cfg cp zoo_sample.cfg zoo.cfg 编辑修改数据路径, ...
- MySQL常用方法
1.INSTR,例:INSTR(content,'\"SHOP_DES\"')>0,返回字符串在某一个字段的内容中第一次出现位置,没有为0 2.REPLACE,例:conte ...
- 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)
1):代理模式(静态代理)点我下载三种模式源码 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成 ...
- rust ownership 系统
### 对象销毁规则 未被使用的函数返回值 被let绑定的值, 在函数末尾销毁,除非被moved ``` let v = obj::new("a"); other_fun(v); ...
- 利用stomp.js实现websocket功能,接收ActiveMQ消息队列
一.ActiveMQ消息发送端 package lixj; import java.util.Date; import javax.jms.Connection; import javax.jms.C ...