【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), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- Spring 注解学习
@GetMapping(value = "/hello/{id}")//需要获取Url=localhost:8080/hello/id中的id值 public String say ...
- 08-可滚动Widget
可滚动Widget ViewPort视口 在Flutter中,术语ViewPort(视口),如无特别说明,则是指一个Widget的实际显示区域.例如,一个ListView的显示区域高度是800像素,虽 ...
- CentOS7和OpenStack的笔记(一)
CentOS7和OpenStack的笔记(一) 最近搞CentOS7系统和OpenStack框架,整了近一个星期,系统装了好几次,框架搭了又从搭.虽然最后的实例没能启动成功,但是在这专研的一个星期里, ...
- css position:absolute align center bottom
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- PL/SQL轻量版(四)——存储函数/存储过程与触发器
概述 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数 ...
- 20155311 《Java程序设计》实验四 (Android程序设计)实验报告
20155311 <Java程序设计>实验四 (Android程序设计)实验报告 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组 ...
- 20155322 2016-2017-2 《Java程序设计》 第一周学习总结
20155322 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习内容的主要是: 一.浏览教材,根据自己的理解每章提出一个问题. 在浏览教材后,我提 ...
- yaml中的锚点和引用
项目引入yaml语言来写配置文件,最近发现利用其锚点&和引用*的功能,可以极大减少配置文件中的重复内容,将相同配置内容收敛到锚点处,修改时,只需要修改锚点处的内容,即可在所有引用处生效. ya ...
- PostgreSQL Streaming Replication的FATAL ERROR
磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面: PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gm ...
- Java SE教程
第0讲 开山篇 读前介绍:本文中如下文本格式是超链接,可以点击跳转 >>超链接<< 我的学习目标:基础要坚如磐石 代码要十份规范 笔记要认真详实 一.java内容介绍 ...