线性表
来源:互联网 发布:单纯的js做动态网站 编辑:程序博客网 时间:2024/06/06 01:18
引言
多项式的表示
[例] 一元多项式及其运算
一元多项式 :
主要运算:多项式相加、相减、相乘等
【分析】如何表示多项式?
方法1:顺序存储结构直接表示
数组各分量对应多项式各项:
a[i]: 项xi的系数ai
\
这种表示方法虽然方便,但是如果零项太多,比如x+3x^2000,就会造成空间的浪费(同时还要循环2000多次,操作效率不高),所以这种做法并不明智。
方法2:顺序存储结构表示非零项
用结构数组表示:数组分量是由系数ai、指数i组成的结构,对应一个非零项
按指数大小来进行有序存储!
相加过程:从头开始,比较两个多项式当前对应项的指数
方法3:链表结构存储非零项
链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域
typedef struct PolyNode *Polynomial;typedef struct PolyNode {int coef;int expon;Polynomial link;}
线性表
“线性表(Linear List)”:由同类型数据元素构成有限序列的线性结构
1.表中元素个数称为线性表的长度
2.线性表没有元素时,称为空表
3.表起始位置称表头,表结束位置称表尾
线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:线性表是 n (≥0)个元素构成的有限序列( a1, a2, ...,an )
操作集:线性表L ∈List,整数i表示位置,元素X∈ ElementType,
线性表基本操作主要有:
1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;
3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;
4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;
5、void Delete( int i, List L ):删除指定位序i的元素;
6、int Length( List L ):返回线性表L的长度n。
线性表的顺序存储实现
利用数组的连续存储空间顺序存放线性表的各元素
typedef struct{ElementType Data[MAXSIZE];int Last;} List;List L, *PtrL;访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]
线性表的长度:L.Last+1 或 PtrL->Last+1
主要操作的实现
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; }; /* 初始化 */ List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; return L; } /* 查找 */ #define ERROR -1 Position Find( List L, ElementType X ) { Position i = 0; while( i <= L->Last && L->Data[i]!= X ) i++; if ( i > L->Last ) return ERROR; /* 如果没找到,返回错误信息 */ else return i; /* 找到后返回的是存储位置 */ } /* 插入 */ /*注意:这里P是存储下标位置(从0开始),合法的P∈[0,n]*/ void Insert( List L, ElementType X, Position P ) /* 在L的指定位置P前插入一个新元素X */ { Position i; if ( L->Last == MAXSIZE-1) { printf("表满"); /* 表空间已满,不能插入 */ } if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */ printf("位置不合法"); } for( i=L->Last; i>=P; i-- ) L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */ L->Data[P] = X; /* 新元素插入 */ L->Last++; } /* 删除 */ /*注意:这里P是存储下标位置(从0开始),合法的P∈[0,n-1]*/ void Delete( List L, Position P ) { /* 从L中删除指定位置P的元素 */ Position i; if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */ printf("位置%d不存在元素", P ); } for( i=P+1; i<=L->Last; i++ ) L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */ L->Last--; /* Last仍指向最后元素 */ }
线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
相对于顺序存储的优点:插入、删除不需要移动数据元素,只需要修改“链”。
主要操作的实现
typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; List Next; }; /*求表长*/ int Length ( List PtrL ) { List p = PtrL; /* p指向表的第一个结点*/ int j = 0; while ( p ) { p = p->Next; j++; /* 当前p指向的是第 j 个结点*/ } return j; } /* 查找 */ #define ERROR -1 /*按序号查找: FindKth*/ List FindKth( int K, List PtrL ) /*K∈[0,n-1]*/ { List p = PtrL; int i = 0; while (p !=NULL && i < K ){ p = p->Next; i++; } if ( i == K ) return p; /* 找到第K个,返回指针 */ else return NULL; /* 否则返回空 */ } /*按值查找: Find*/ List Find( ElementType X, List PtrL ) { List p = PtrL; while ( p!=NULL && p->Data != X ) p = p->Next; return p; } /* 插入 */ List Insert( ElementType X, int i, List PtrL ) /*在第i个结点前插入一个值为X的新结点*/ { List p,s; if ( i == 0 ) { /* 新结点插入在表头 */ s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/ s->Data = X; s->Next = PtrL; return s; /*返回新表头指针*/ } p = FindKth(i-1, PtrL ); /* 查找第i-1个结点 */ if ( p == NULL ) { /* 第i-1个不存在,不能插入 */ printf("参数i错"); return NULL; } else { s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/ s->Data = X; s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/ p->Next = s; return PtrL; } } /* 删除 */ List Delete( int i, List PtrL ) { List p, s; if ( i == 0 ) { /* 若要删除的是表的首结点 */ s = PtrL; if (PtrL!=NULL) PtrL = PtrL->Next; /*从链表中删除*/ else return NULL; free(s); /*释放被删除结点 */ return PtrL; } p = FindKth( i-1, PtrL ); /*查找第i-1个结点*/ if ( p == NULL ) { printf(“第%d个结点不存在”, i-1); return NULL; } else if ( p->Next == NULL ){ printf(“第%d个结点不存在”, i); return NULL; } else { s = p->Next; /*s指向第i个结点*/ p->Next = s->Next; /*从链表中删除*/ free(s); /*释放被删除结点 */ return PtrL; } }
- 线性表--线性存储
- 线性表 线性结构
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 线性表
- 猫哥带你去战斗——Java Web开发——前言[0]
- 拷贝加指针拷贝
- mac os下 ionic 2 安装(二),酷炫的hello world 先跑起来!!(运行app)
- 04 - Windows8中安装及验证Docker
- 第十四周项目2--二叉树排序树中查找的路径
- 线性表
- Android GridView和EditText焦点冲突问题
- 浅谈IQKeyboardManager第三方库的使用
- 05 - Docker Machine 概述
- UITextView
- Ubuntu安装Protobuf2.5
- 单链表基本操作(1)
- AQS同步工具类对比
- 06 - 分析docker run hello-world