Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >期末复习之数据结构 第2章 线性表

期末复习之数据结构 第2章 线性表

作者头像
henu_Newxc03
发布于 2021-12-28 04:38:01
发布于 2021-12-28 04:38:01
74700
代码可运行
举报
运行总次数:0
代码可运行

目录

一.课本知识点

1.线性结构

2.线性表

3.线性表的顺序表示

4.顺序表的基本操作

5.线性表的链式表示

6.链表的基本操作

总结

二.练习题

一.课本知识点

1.线性结构

  • 定义:若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
  • 可表示为:(a1 , a2 , ……, an)是一个有序(次序)集 。 特点: ① 只有一个首结点和尾结点; ② 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。 简言之,线性结构反映结点间的逻辑关系是 一对一 的。

2.线性表

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//伪代码
void union(List &La, List Lb) {
    La_len = ListLength(La);    // 求线性表La的长度
    Lb_len = ListLength(Lb);   // 求线性表Lb的长度
    for(i=1;i<=Lb_len; i++) {
        GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
        if (!LocateElem ( La, e, equal( )) ) 
            ListInsert(La, ++La_len, e);
              // La中不存在和 e 相同的数据元素,则插入之
        }//for
} // union

3.线性表的顺序表示

  • 线性表的顺序表示又称为顺序存储结构或顺序映像。
  • 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。 简言之,逻辑上相邻,物理上也相邻
  • 顺序存储方法:用一组地址连续的存储单元依次存储线性表的元素,可通过数组V[n]来实现。
  • 顺序表的特点:
  1. 逻辑上相邻的数据元素,其物理上也相邻;
  2. 若已知表中首元素在存储器中的位置,则其他元素存放位置亦可求出(利用数组下标)。计算方法是(参见存储结构示意图): 设首元素a1的存放地址为LOC(a1)(称为首地址), 设每个元素占用存储空间(地址长度)为L字节, 则表中任一数据元素的存放地址为: LOC(ai+1) = LOC(ai)+L LOC(ai) = LOC(a1) + L *(i-1)
  • 顺序表的存储结构示意图:
  • 注意:

4.顺序表的基本操作

线性表的动态分配顺序存储结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# define  LIST_INIT_SIZE   100       //符号常量   // 线性表存储空间的初始分配量
# define   LISTINCREMENT    10     // 线性表存储空间的分配增量
typedef struct {                                    //typedef 给结构类型起别名
       ElemType *elem;                          //表基址
       int                length;                      //表长(特指元素个数)
       int                listsize;                     //表当前存储容量
}SqList

线性表的清空操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ClearList(Sqlist &L)
{
    if(L.elem==NULL)
        exit(ERROR);
    int i;
    ElemType *p_elem = L.elem;
    for(i = 0;i < L.length;i++){
        *L.elem = NULL;
        L.elem++;
    }
    L.elem = p_elem;
    L.length = 0;
    return OK;
}

线性表的求长度操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ListLength(SqList  L)
{
	 return L.length;
}

线性表元素的修改操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
status modify(SqList &L, int i, ElemType e){ //注意:i是位置		
		if (i<1 || i>L.length) //判断位置i是否合法
        return ERROR;
        L.elem[i-1]=e; //或者 *(L.elem+i-1)=e	
        return OK;
}

线性表元素的插入操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ListInsert_Sq(SqList &L,int i, ElemType e){
    if(i<1 || i>L.length+1) return ERROR
    if(L.length>=L.listsize){
        newbase=(ElemType )realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))
        if(!newbase)exit(OVERFLOW);
        L.elem=newbase;  
        L.listsize+=LISTINCREMENT
    }
}

5.线性表的链式表示

  • 链式存储特点:逻辑上相邻,物理上不一定相邻
  • 链表存放示意图:
  • 每个存储结点都包含两部分:数据域和指针域(链域) 。
  • 在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。
  • 与链式存储有关的术语
  • 何谓头指针、头结点和首元结点?

  • 如何表示空表?
  • 头结点的数据域内装的是什么?
  • 循环链表:表中最后一个结点的指针域指向头结点,整个链表形成一个环。
  • 双向链表:结点有两个指针域,一个指向直接前驱,一个指向直接后继。

6.链表的基本操作

单链表的读取(或修改)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status GetElem_L(LinkList L, int i, ElemType &e){
// 注意:L为带头结点的单链表的头指针
// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
     P=L->next;      
     j=1;//j用来计数
     while(p && j<i)  {p=p->next;    ++j;}
     if (!p || j>i)   return ERROR;
//!p即p为空,有两种情况,第一种是表为空;第二种是i的值超过了表的长度,while循环执行完后p走到最后一个元素还没有找到i的位置。j >i 就是i是0或者负数的情况。
     e=p->data;
     return OK;
}

单链表的删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ListDelete_L(LinkList &L,int i,ElemType &e){
		p=L; j=0;
		while(p->next && j<i-1){p=p->next;++j}
		if(!p->next || j>i-1) return ERROR;
		//p指向第i-1个结点
		//判断p->next ,是要保证p的后面还有结点。
		q=p->next; 
		e=q->data; 
		p->next=q->next;
		free(q)
          return OK;
	}

单链表的遍历

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void travle(LinkList L){
	LinkList p
	cout<<"建立的链表为:";
	for(p=L->next;p!=NULL;p=p->next)
		cout<<p->data<<"  ";
	}

二.练习题

题组一:

题组二:

一、填空 1. 在顺序表中插入或删除一个元素,需要平均移动 n/2或n-1/2 元素,具体移动的元素个数 插入或删除元素的位置 有关。 2. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。 3. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。 4. 在单链表中,除了首元结点外,任一结点的存储位置由 前驱结点的后继指针 指示。 二、简答题 1. 试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好? 顺序表 优点:存储密度大 存储空间利用率高 缺点:插入或删除元素时不方便 链式存储 优点:插入或删除元素时很方便 缺点:存储密度小 存储空间利用率低 在插入和删除情况比较少的情况下用顺序表比链表好 2 . 描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。在单链表中设置头结点的作用是什么? 头指针: 指向链表第一个结点的指针 头节点:在首元结点之前附设的一个结点,该结点不存储数据元素,其指针指向首元节点,其作用主要是为了方便对链表的操作 首元结点:链表中存储第一个数据元素的结点 三、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L={23,17,47,05,31},若它以链接方式存储在下列100~119号地址空间中,每个结点由数据(占2个字节)和指针(占2个字节)组成,如下所示: 05 U 17 X 23 V 31 Y 47 Z ^ ^ 100 120 其中指针X,Y,Z的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少? X:116 Y:NULL Z:100 首结点起始地址108 末结点起始地址为112 四、编程题 1. 写出在顺序存储结构下将线性表逆转的算法,要求使用最少的附加空间。 void Reverse(SqList& L) { for (int i = 0; i <= (L.length - 1) / 2; i++) { int temp = L.data[i]; L.data[i] = L.data[length - 1-i]; L.data[length-1-i] = temp; } }

  1. 编写程序,将若干整数从键盘输入,以单链表形式存储起来,然后计算单链表中结点的个数(其中指针P指向该链表的第一个结点)。

#include <iostream> using namespace std; #define ElemType int #define Status int #define MAXSIZE 100 typedef struct LNode { ElemType data;//数据域 struct LNode* next;//指针域 }LNode, * LinkList; Status InitList(LinkList& L) { L = new LNode; L->next = NULL; return 1; } Status InsertList(LinkList& L, int pos, ElemType e) { LNode* s; LinkList p = L; int j = 0; while (p&&(j<pos-1)) { p = p->next; ++j; } if (!p || j > pos - 1) { return 0; } s = new LNode; s->data = e; s->next = p->next; p->next = s; return 1; } int main() { LinkList P; InitList(P); int num; cout << "请输入整数,按ctrl+z结束输入" << endl; int Length = 1; while (cin>>num) { Length++; InsertList(P, Length, num); } cout <<"单链表结点个数为:"<< Length-1 << endl; }

题组三:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数据结构】详细剖析线性表
经过这段时间的学习与分享,想必大家跟我一样都已经对线性表的相关内容比较熟悉了。为了更好的巩固线性表相关的知识点,下面我们一起将线性表这个章节的内容梳理一遍吧。
蒙奇D索隆
2024/01/01
3220
【数据结构】详细剖析线性表
数据结构之线性表
基本概念 线性表(List):由零个或多个数据元素组成的有限序列。 特征: 1.线性表是一个序列。 2.0个元素构成的线性表是空表。 3.线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。 4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。 线性表抽象数据类型 基于线性表的特征,线性表可以做如下操作:  InitList(*L);//初始化操作,建立一个空的线性表  ListEmpty(L);//若线性表为空,返回true,否
xiangzhihong
2018/02/05
7380
数据结构之线性表
《王道》数据结构笔记整理2022级_数据结构笔记整理
1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。
全栈程序员站长
2022/09/22
3.2K0
《王道》数据结构笔记整理2022级_数据结构笔记整理
线性表的顺序存储
线性表的顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称为线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。
老齐
2023/03/02
1.7K0
线性表的顺序存储
《大话数据结构》线性表代码总结
//线性表存储的结构代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAXSIZE 1000//静态链表部分的 #define MAX_SIZE 20//最大长度 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //线性表顺序存储结构 //自定义的类型 以描述返回状态值 typedef int Status;//Status是函数的类型,其值是函数结果的状
半生瓜的blog
2023/05/12
2290
《大话数据结构》线性表代码总结
数据结构(1)-线性表
线性表是一种常用的数据结构。在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。  线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
黄规速
2022/04/14
2520
顺序线性表
线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。 线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址。 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。 数组类型有随机存取的特性,因此通常都用数组来描述数据接哦故中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,在C语言中可用动态分配的一维数组,如下描述。 /* 线性表的动态分配顺序存储结构 */
猿人谷
2018/01/17
7950
顺序线性表
线性表的顺序表示和实现(参考严蔚敏版)
在顺序表中,删除一个元素和插入一个元素的操作非常相似。删除一个元素即是将i位置之后的所有元素向前移一位。
跋扈洋
2021/05/19
8650
线性表的顺序表示和实现(参考严蔚敏版)
线性表(二)
在开始这篇文章之前,我先把程序当中用到的一些头文件以及预定义给出 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 //线性表初始分配空间大小 typedef int ElemType //预定义ElemType为int类型标识符  #define ERROR -1    //预定义ERROR的值为-1  #define OK 1        //预定义OK的值为1 l 线性表的顺序存储表示 算法描述: 线性表中的数据元素我们一般用结
mathor
2018/06/22
4850
数据结构-线性表
线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列,其中n为表长,当n = 0时线性表是一个空表。若用L命名线性表,则其一般表示为:
计蒙不吃鱼
2025/06/12
950
数据结构-线性表
线性表的基本代码(存储结构、插入、删除)c语言
一、线性表的顺序/单链表存储的结构代码 顺序存储 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList; 链式存储 typedef struct Node { ElemType data; struct Node* next; }Node; typedef struct Node* LinkList; 顺序存储的插入、删除操作 Status ListI
亦小河
2022/11/14
1.2K0
数据结构实训作业(I)
本关任务:已知顺序表L中的数据元素递增有序,数据元素类型为int。相关定义如下: #define LIST_INIT_SIZE 20 #define LISTINCREMENT 10 typedef int ElemType; typedef struct { ElemType *elem; int length; int listsize; } SqList; 试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 函数原型:int insert(SqList &L,ElemType x);
用户7267083
2022/12/08
6230
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
开放式问题的解题思路: 问题: 请描述顺序表和链表的bla bla bla…实现线性表时,用顺序表还是链表好? 答案:
盛透侧视攻城狮
2024/10/22
1490
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构——顺序表
基本概念和术语 数据:客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。如:整数、实数、字符串、图形、图像、声音等经过特殊编码后的数据。 数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。(数据元素也称为元素、记录等)。数据元素用于完整地描述一个对象,如:学生记录、树中棋盘的一个格局、图中的一个顶点等。 数据项:组成数据元素的、有独立含义的、不可分割的最小单位。例如:学生基本信息表中的学号、姓名、性别等。 数据对象:性质相同的数据元素的集合,是数据的一个子集。(只要
ruochen
2021/06/28
7500
数据结构——顺序表
数据结构-线性表顺序存储
由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表,(n=0)的时候称为空表。 一个数据元素可以是简单的一个数据,一个符号,也可以是复杂的若干个数据项的组合
姓王者
2024/11/04
1400
线性表详解01
看着比较复杂,这就是结构体,struct typedef是重命名,比如这个重命名为了SqList
学编程的小程
2023/10/11
1900
数据结构学习—线性表
线性表 线性表的概念 定义 线性表是由n(n>=0)个类型相同的数据元素组成的有限序列,数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后驱。 特点: 同一性:线性表必须由同类数据元素组成 有穷性:线性表由有限个数据元素组成,表长就是表中数据元素个数 有序性:线性表中相邻元素之间存在着序偶关系。 线性表的顺序存储 定义 是指用一组地址连续的存储单元依次线性表中的各个元素,使得线性表在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中。 C语言定义 #define MAXSI
用户5513909
2023/04/25
1860
数据结构学习—线性表
数据结构 || 顺序表
1.代码存在逻辑错误,即算法的设计思路不能完美实现删除的需求。 2.算法的效率很低,会浪费很多的时间。
用户10271432
2022/12/19
4780
数据结构 || 顺序表
数据结构
注意下标的起始,线性表从1开始,而数组下标从0开始。操作数 i 是从1开始,存到数组中应该是从 i-1 开始
h3110_w0r1d
2024/02/19
1720
数据结构
数据结构:线性表的基本操作与链式表达
● LocateElem(L,e): 按值查找操作。在表工中查找具有给定关键字值的元素。
钮祜禄.爱因斯晨
2025/05/31
1210
数据结构:线性表的基本操作与链式表达
相关推荐
【数据结构】详细剖析线性表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验