数据对象集:线性表是N(>=0)个元素构成的有序序列,a1,a2,a3.....a(N-1),aN,a(N+1)

线性表上的基本操作有:

⑴ 线性表初始化:Init_List(L)
初始条件:表L不存在操作结果:构造一个空的线性表

⑵ 求线性表的长度:Length_List(L)
初始条件:表L存在
操作结果:返回线性表中的所含元素的个数

⑶ 取表元:Get_List(L,i)
初始条件:表L存在且1<=i<=Length_List(L)
操作结果:返回线性表L中的第i个元素的值或地址

⑷ 按值查找:Locate_List(L,x),x是给定的一个数据元素。
初始条件:线性表L存在
操作结果:在表L中查找值为x的数据元素,其结果返回在L中首次出现的值为x的那个元素的序号或地址,称为查找成功; 否则,在L中未找到值为x的数据元素,返回一特殊值表示查找失败。

⑸ 插入操作:Insert_List(L,i,x)
初始条件:线性表L存在,插入位置正确(1<=i<=n+1,n为插入前的表长)。
操作结果:在线性表L的第i 个位置上插入一个值为x 的新元素,这样使原序号为i , i+1, ... , n 的数据元素的序号变为i+1,i+2, ... , n+1,插入后表长=原表长+1。

⑹ 删除操作:Delete_List(L,i)
初始条件:线性表L存在,1<=i<=n。
操作结果:在线性表L中删除序号为i的数据元素,删除后使序号为i+1, i+2,..., n的元素变为序号为i, i+1,...,n-1,新表长=原表长-1。

线性表的存储:顺序存储

 #include<stdio.h>
#include <string.h>
#include <stdlib.h> #define max 10
typedef struct{
int data[max]; //数组
int last; //最后一个数据在数组中的位置
}LIST; //初始化
LIST * makeEmpty();
//查找,返回数据在数组中的位置,不存在返回-1
int find(int,LIST *);
//插入,成功1,失败-1
int insert(int site,int num,LIST * Ptrl);
//打印数据结构
void dump(LIST *);
//删除
int del(int site,LIST * Ptrl); void main(void)
{
int num;
LIST * demo;
demo = makeEmpty(); } //初始化
LIST * makeEmpty()
{
LIST * Ptrl;
Ptrl = (LIST*)malloc(sizeof(LIST));
Ptrl->last = -; //为空时last为1
return Ptrl;
}
//查找,返回数据在数组中的位置,不存在返回-1
int find(int num,LIST * Ptrl)
{
int i=;
while(i<=Ptrl->last && Ptrl->data[i]!=num)
{
i++;
}
//如果i大于数据的长度,则就是没有找到
if(i > Ptrl->last)
return -;
//返回数据的位置
return i;
}
//插入,成功1,失败-1
int insert(int site,int num,LIST * Ptrl)
{
//1、判断是否已经满了,最后的位置=长度-1
if(Ptrl->last == max-){
return -;
}
//2、判断要插入的位置是否大于等于长度 site >= max
if(site< || Ptrl->last >= max){
return -;
}
//3、从最后一个数据开始移动,下一位填充上一位的数据 ,data[n+1] = data[n],data[n]=data[n-1],直到n>=site
int i;
for(i=Ptrl->last;i>=site;i--)
{
Ptrl->data[i+] = Ptrl->data[i];
}
Ptrl->data[site] = num;
Ptrl->last += ;
return ;
} //打印数据结构
void dump(LIST * Ptrl){
int i=;
while(i<=Ptrl->last)
{
printf("%d=>%d---%d\n",i,Ptrl->data[i],Ptrl->last);
i++;
}
}
//删除
int del(int site,LIST * Ptrl)
{
//检测删除的位置是否存在
if(site > Ptrl->last || site<){
return -;
} int i;
for(i=site;i<=Ptrl->last;i++)
{
Ptrl->data[i] = Ptrl->data[i+];
}
Ptrl->last--;
return ;
}

线性表的存储:链式存储

  存放数据元素信息的称为数据域,存放其后继地址的称为指针域。因此n个元素的线性表通过每个结点的指针域拉成了一个“链子”,称之为链表。因为每个结点中只有一个指向后继的指针,所以称其为单链表。

  链表是由一个个结点构成的,结点定义如下:
  typedef struct node{

    datatype data;
    struct node *next;
  } LNode,*LinkList;

  定义头指针变量:
  LinkList H;

  

 #include<stdio.h>
#include <string.h>
#include <stdlib.h> #define max 10
typedef struct list{
int data;
struct list * next;
}LIST; //初始化
LIST * initialize();
//按key查找
LIST * findByKey(int key,LIST * Ptrl);
//按value查找
LIST * findByVal(int value,LIST * Ptrl);
//插入
int insert(int key,int val,LIST * Ptrl);
//删除
int delete(int key,LIST * Ptrl);
//表长
int length(LIST * Ptrl);
//打印
void dump(LIST * Ptrl); void main(void)
{
LIST * demo;
demo = initialize();
insert(,,demo);
insert(,,demo);
LIST * find = findByVal(,demo);
//demo = initialize();
dump(demo);
//printf("%d",length(demo));
} //初始化
LIST * initialize()
{
LIST * Ptrl;
Ptrl = (LIST *)malloc(sizeof(LIST));
if(Ptrl==NULL){
puts("molloc fail in line 38\n");
exit;
}
Ptrl->next = NULL;
Ptrl->data = ;
return Ptrl;
}
//按key查找
LIST * findByKey(int key,LIST * Ptrl)
{
if(key==)
{
return Ptrl;
} LIST * p;
p = Ptrl;
int i=; while(p!=NULL && i<key)
{
p = p->next;
i++;
}
if(i==key){
return p;
}
return NULL;
}
//按value查找
LIST * findByVal(int value,LIST * Ptrl)
{
LIST * p;
p = Ptrl;
while(p!=NULL && p->data!=value)
{
p=p->next;
}
if(p != NULL){
return p;
}else{
return NULL;
}
} //插入
int insert(int key,int val,LIST * Ptrl)
{
LIST * p,* find; p = (LIST *)malloc(sizeof(LIST));
if(Ptrl==NULL){
puts("molloc fail in line 86\n");
exit;
} find = findByKey(key-,Ptrl); p->data = val;
p->next = find->next;
find->next = p; return ;
}
//删除
int delete(int key,LIST * Ptrl)
{
//检查长度的合法性 //删除
LIST * p,* find;
p = findByKey(key,Ptrl);
find = findByKey(key-,Ptrl);
find->next = p->next;
free(p);
}
//表长
int length(LIST * Ptrl)
{
int i=;
LIST * p = Ptrl;
while(p!=NULL)
{
p = p->next;
i++;
}
return i;
}
//打印
void dump(LIST * Ptrl)
{
LIST * p = Ptrl;
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}

栈的存储

    顺序存储

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max 10 typedef struct list{
int data[max];
int top;
}LIST; //初始化
LIST * initialize();
//判断是否为空
int isEmpty(LIST *);
//判断是否满了
int isFull(LIST *);
//出栈
int pop(LIST *);
//入栈
int push(int value,LIST * Ptrl);
//打印
void dump(LIST *); void main(void)
{
LIST * demo = initialize();
push(,demo);
push(,demo);
push(,demo);
pop(demo);
dump(demo);
} //初始化
LIST * initialize()
{
LIST * Ptrl;
Ptrl = (LIST *)malloc(sizeof(LIST));
if(Ptrl == NULL)
{
puts("malloc error!!!\n");
exit;
}
Ptrl->top=-;
return Ptrl;
}
//判断是否为空
int isEmpty(LIST * Ptrl)
{
if(Ptrl->top == -)
{
return ;
}
return ;
} //判断是否满了
int isFull(LIST * Ptrl)
{
if(Ptrl->top >= max-)
{
return ;
}
return ;
}
//出栈
int pop(LIST * Ptrl)
{
if(isEmpty(Ptrl) == )
{
puts("is empty");
exit;
} int temp = Ptrl->data[Ptrl->top];
Ptrl->top--;
return temp;
}
//入栈
int push(int value,LIST * Ptrl)
{
if(isFull(Ptrl) == )
{
puts("is full");
exit;
}
Ptrl->top++;
Ptrl->data[Ptrl->top] = value;
return ;
}
//打印
void dump(LIST * Ptrl)
{
if(isEmpty(Ptrl) == )
{
puts("is empty");
exit;
} int i;
for(i=Ptrl->top;i>=;i--)
{
printf("%d\n",Ptrl->data[i]);
}
}

 链式村粗

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max 10 typedef struct list{
int data;
struct list * next;
}LIST; //初始化
LIST * initialize();
//判断是否为空
int isEmpty(LIST *);
//判断是否满了
int isFull(LIST *);
//出栈
int pop(LIST *);
//入栈
int push(int value,LIST * Ptrl);
//打印
void dump(LIST *); void main(void)
{
LIST * demo = initialize();
push(,demo);
push(,demo);
push(,demo);
push(,demo);
pop(demo);
dump(demo);
} //初始化
LIST * initialize()
{
LIST * Ptrl;
Ptrl = (LIST *)malloc(sizeof(LIST));
Ptrl->next = NULL;
//Ptrl->data = -1;
return Ptrl;
}
//判断是否为空
int isEmpty(LIST * Ptrl)
{
if(Ptrl->next == NULL)
{
return ;
}
return ;
} //判断是否满了
int isFull(LIST * Ptrl)
{ }
//出栈
int pop(LIST * Ptrl)
{
if(isEmpty(Ptrl)==){
puts("is empty");
exit;
}
LIST * temp = Ptrl->next;
int data = temp->data;
Ptrl->next = temp->next;
free(temp);
return data;
}
//入栈
int push(int value,LIST * Ptrl)
{
LIST * temp = (LIST *)malloc(sizeof(LIST));
temp->next = Ptrl->next;
temp->data = value;
Ptrl->next = temp;
return ;
}
//打印
void dump(LIST * Ptrl)
{
if(isEmpty(Ptrl)==){
puts("is empty");
exit;
}
LIST * p = Ptrl->next;
while(p != NULL)
{
printf("%d\n",p->data);
p = p->next;
} }

【c】线性表的更多相关文章

  1. 线性表Linearlist

    顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST         1.置空表 void SetNull(&L)     2.求长度 int Length(L)     3.取元素 ...

  2. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  3. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  4. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  5. Java集合类学习笔记(各种线性表性能分析)

    ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...

  6. 动态分配的顺序线性表的十五种操作—C语言实现

    线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...

  7. Java Se :线性表

    Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...

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

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

  9. 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现

    注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...

  10. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

随机推荐

  1. 数据结构与算法之Stack(栈)——in dart

    用dart 语言实现一个简单的stack(栈).栈的内部用List实现. class Stack<E> { final List<E> _stack; final int ca ...

  2. Hibernate学习笔记四

    1 整合log4j(了解) l slf4j 核心jar  : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. l 整合导入jar包 log4j 核心包 ...

  3. [POJ3041]Asteroids

    Asteroids 好久没打过网络流相关的题了...... 题意:一个矩阵n×n,有m个东西,一次去掉一整行或一整列,问最少次数. 题解:匈牙利. 把每行变成一个点(X集合),每列变成一个点(Y集合) ...

  4. sqoop 数据迁移

    sqoop 数据迁移 1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.H ...

  5. python2 - 列表

    列表 a = [1,2,3,4,5,6,7] a[0:4:1]//正向索引 a[-1:-2:-1]//反向索引 列表添加 a = [1, 2] b = [3, 4] +:a + b//把a和b连接,重 ...

  6. VIN码识别/车架号识别独家支持云识别

    VIN码(车架号)对于懂车的人来说并不陌生,不要小看这一串字符,从VIN码中可以读懂车辆的生产厂家.年代.车型.车身型式及代码.发动机代码及组装地点等信息. 一辆汽车的VIN码也是车辆的唯一身份证明, ...

  7. Linux 安装Zookeeper<准备>(使用Mac远程访问)

    阅读本文需要安装JDK 一 Zookeeper简介 zookeeper是用java语言编写的一款为分布式应用所设计的协调服务 zookeeper是apacahe hadoop的子项目 使用zookee ...

  8. 常用monkey_app稳定性

    Monkey稳定性测试 1       前言 为方便快速上手Monkey测试相关问题,针对测试中发现的Monkey问题进行了整理总结,供定位Monkey参考. 2       关于Monkey测试 2 ...

  9. 622.设计循环队列 javascript实现

    设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列 ...

  10. HTML(1)简介

    "超"文本标记语言--HTML 文本,是指书面语言的表现形式. 百度百科 说白了,文本就是你能看得到的字,不论是纸上的还是屏幕上的,都是文本.文本就是用来记录信息一种形式. 那么, ...