数据对象集:线性表是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. 【树形DP】洛谷1122_最大子树和

    又是一道树形DP的入门题,思想非常简单  然而我最开始还是存了两个状态[传送门] 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上 ...

  2. opencv+python视频实时质心显示

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

  3. Linux 下 终端 相关的命令

    1. 概述 Linux 服务器, 通常可以由多个终端连接 简单介绍一些 终端 相关的操作 最终的目的, 是定位到某个终端, 然后把它 踢下来, 甚至可以不让他再次连接 2. 环境 操作系统 CentO ...

  4. AWT之—画图

    package edu.ch4; import java.awt.Color;import java.awt.Font;import java.awt.Frame;import java.util.C ...

  5. 20155319 2016-2017-2 《Java程序设计》第十周学习总结

    20155319 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络编程概述 网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两 ...

  6. CSS深入理解absolute

    1.图片目标来覆盖,无依赖,真不赖: 2.如何定位下拉框,最佳实践来分享: 3.对其居中或边缘,定位实现有脸面: 4.星号时有时没有,破坏队形不用愁: 5.图文对其兼容差,绝对定位来开挂: 6.文字溢 ...

  7. [SDOI2010]地精部落 DP

    LG传送门 DP好题 题意很简单,就是求1-n的排列,满足一个数两边的数要么都比它大要么都比它小,求这样的排列个数对\(p\)取膜的值(为了表述简单,我们称这样的排列为波动序列). 这个题我第一眼看到 ...

  8. 【vijos1049】送给圣诞夜的礼品

    题面 描述 当小精灵们把贺卡都书写好了之后.礼品准备部的小精灵们已经把所有的礼品都制作好了.可是由于精神消耗的缘故,他们所做的礼品的质量越来越小,也就是说越来越不让圣诞老人很满意.可是这又是没有办法的 ...

  9. MyBatis.Net 配置

    假设我们现在有这样的需求,要对学生信息进行管理 学生表有要以下要求 字段名称 数据类型 说明 stuNo 字符 学号,该列必填,为主键递增 stuName 字符 学生姓名,该列必填,要考虑姓氏可能是两 ...

  10. Linux中新增硬盘的分区,格式化与挂载

    Linux中新增硬盘的分区,格式化与挂载 本篇教程内容为怎样对Linux新增硬盘进行挂载,所以如果有准备新增硬盘但是有各种问题的,请参看本篇教程. 我们先说说什么是挂载? 我们知道Linux中的所有设 ...