#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++实现线性链表的更多相关文章

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

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

  2. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  3. javascript实现数据结构与算法系列:功能完整的线性链表

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

  4. select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)

    一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...

  5. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  6. python算法:LinkedList(双向线性链表)的实现

    LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一 ...

  7. C代码实现非循环单链表

    C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...

  8. 线性链表的双向链表——java实现

    .线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...

  9. 【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)

    二叉树存储结构属于非线性链表结构,转化成线性链表结构,能简化操作和理解.然而由非线性转线性需要对整个树遍历一次,不同的遍历方式转化结果页不一样.下面以先序为例. 方法一: 递归法.递归遍历二叉树,因为 ...

  10. [C++]线性链表之单链表

    [文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...

随机推荐

  1. linux 11 -- mount,umount

    Linux 文件系统是一个以 / 为根的大树,我们在不同的设备和分区上都有文件系统.我们如何处理这种明显的不一致性?根 (/) 文件系统是在初始化过程中挂载的.您创建的其他每个文件系统在挂载 在挂载点 ...

  2. LeetCode:最长回文子串【5】

    LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...

  3. iOS 读取本地Json文件

    之前写过类似的方法 今天写这个 的目的是 应对开发过程中面对 服务端数据刚定下模型 但是接口不通 的情况下 不耽误客户端开发进度 + (id)getJsonDataJsonname:(NSString ...

  4. Python lambda 匿名函数

    lambda [arg1[, arg2, ... argN]]: expression Python使用lambda关键字创造匿名函数.所谓匿名,意即不再使用def语句这样标准的形式定义一个函数.这种 ...

  5. 【leetcode刷题笔记】Valid Sudoku

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  6. debian下为stm32f429i-discovery编译uboot、linux内核和根文件系统

    交叉编译器:arm-uclinuxeabi-2010q1 交叉编译器下载下来后解压,然后将其中bin文件夹路径加入到PATH变量中. 根据<debian下烧写stm32f429I discove ...

  7. Android 双u盘方案【转】

    本文转载自:https://blog.csdn.net/kc58236582/article/details/49618445 1      L1813系统上双U盘设计方案——系统设计 1.1     ...

  8. 剑指offer——树中两个节点的最低公共祖先

    代码来源与<剑指offer> 得到从根节点开始到输入的两个结点的两条,需要遍历两次树,每遍历一次的时间复杂度是O(n),得到的两条路径的长度在最差情况时是O(n),通常情况下两条路径的长度 ...

  9. Delphi 函数的重载和作用域

    1.在delphi 中,我们可以使用相同的函数名来调用不同的函数,我们称这个函数为重载,函数的参数类型和参数的个数可以不同,用到的关键字overload:格式如下: function addInt(x ...

  10. springmvc的优化

    二.springmvc的工作机制 在容器初始化时会建立所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化 ...