【c】线性表
数据对象集:线性表是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】线性表的更多相关文章
- 线性表Linearlist
顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST 1.置空表 void SetNull(&L) 2.求长度 int Length(L) 3.取元素 ...
- 数据结构(Java描述)之线性表
基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...
- JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表
Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Java集合类学习笔记(各种线性表性能分析)
ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...
- 动态分配的顺序线性表的十五种操作—C语言实现
线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
- Java Se :线性表
Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- Nexus Repository3安装和maven,npm配置(Linux)
Nexus Repository下载 根据操作系统选择指定版本,本文针对Linux安装,其他的安装过程可能有所差异. https://help.sonatype.com/repomanager3/do ...
- 20155211 《Java程序设计》实验四 Android程序设计
20155211 <Java程序设计>实验四 Android程序设计 一.实验内容及步骤 1.Android Stuidio的安装测试: 安装 Android Stuidio 完成Hell ...
- 20155213 2016-2017-2 《Java程序设计》第六周学习总结
20155213 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 输入与输出 串流设计 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而 ...
- 20155231 2016-2017-2 《Java程序设计》第10周学习总结
20155231 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Jav ...
- a data verification error occurred, file load failed
1. 调试创龙DSP6748的时候,下载.out文件出现这个错误 2. 换了其他板子,还有其他仿真器也不行,最后发现是没加载GEL文件
- python的种类
Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton ...
- zigbee路由(报文实例)
4855 广播 routeRequestId = 6, pathCost = 0 radius=1E 62BB 继续广播 routeRequestId = 6, pathCost = 1 radiu ...
- python学习-linux基本操作
1.sudo 管理员root身份 2.mkdir 创建文件夹 touch 创建文件 3.rm 删除 4.chmod 赋予权限 r(读取):4 w(写):2 x(执行):1 rwx=7,r-x=5等 ...
- selenium自动化之稳定版本环境介绍
大家都知道,目前selenium版本已经升级到3.0了,selenium3只是在selenium2的基础上做了一些调整,最明显的区别就是 selenium2对Firefox的支持最高只支持46及以下版 ...
- jmeter接口测试实例:带参数、带token
测试内容简介: 1.get请求,无参数 2.get请求,参数为第一条响应中的id 3.get请求,带token 结构图: 下面进行详解: 一.添加cookie管理器等 1.添加ht ...