数据对象集:线性表是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. 在客户端模拟调用srv和topic

    rostopic pub -r 10 /toipic_name Tab+Tab rosservice call /service_name  Tab+Tab rostopic pub -r 10 /c ...

  2. 中国大学MOOC-JAVA学习(浙大翁恺)—— 信号报告

    使用switch-case语句的练习 import java.util.Scanner; public class Main { public static void main(String[] ar ...

  3. Go 学习之路:异常处理defer,panic,recover

    Go没有像Java那样的异常机制,它不能抛出异常.因为设计者们认为,将异常与控制结构混在一起容易使得代码变得混乱.于是乎引入Exception处理: defer,panic,recover; 简单描述 ...

  4. R语言学习笔记—朴素贝叶斯分类

    朴素贝叶斯分类(naive bayesian,nb)源于贝叶斯理论,其基本思想:假设样本属性之间相互独立,对于给定的待分类项,求解在此项出现的情况下其他各个类别出现的概率,哪个最大,就认为待分类项属于 ...

  5. springcloud 笔记-服务注册中心

    1.搭建springcloud服务注册中心需要添加eureka的依赖: <?xml version="1.0" encoding="UTF-8"?> ...

  6. 20155215 《Java程序设计》实验二( Java面向对象程序设计)实验报告

    20155215 <Java程序设计>实验二( Java面向对象程序设计)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  7. 20155226 2016-2017-2 《Java程序设计》课程总结

    20155226 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:师生关系 预备作业2:优秀技能经验 预备作业3:虚拟机linux初接触 第一周学习总结: ...

  8. Caliburn.Micro - IResult and Coroutines

    IResult and Coroutines 翻译[三台]:网址[http://home.cnblogs.com/u/3Tai/] Previously, I mentioned that there ...

  9. 对PostgreSQL数据库的hstore类型建立GisT索引的实验

    磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页    回到顶级页面:PostgreSQL索引页[作者 高健@博客园  luckyjackgao@g ...

  10. 润乾报表整合到Tomcat服务器的部署过程

    转载自:http://www.cnblogs.com/avivaye/archive/2012/11/16/2773681.html 使用第三方的报表设计器/服务器来快速的开发报表. 润乾服务器是使用 ...