数据结构(C语言版)之线性表(上)

简介: 前言●数据结构作为计算机专业基础课,综合性强,抽象性高,在一定程度上增加了学习难度,本次我们共同从数据结构的基础探讨,由浅入深进行数据结构的学习。 ●本文只浅显的探讨了顺序表的基本知识,后续会进行链表的知识探讨。作者相信随着学习课程的深入,我们将会在对数据结构有更深的理解与收获!●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

前言

●数据结构作为计算机专业基础课,综合性强,抽象性高,在一定程度上增加了学习难度,本次我们共同从数据结构的基础探讨,由浅入深进行数据结构的学习。

●本文只浅显的探讨了顺序表的基本知识,后续会进行链表的知识探讨。作者相信随着学习课程的深入,我们将会在对数据结构有更深的理解与收获!

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

一、什么是数据结构?

我们先从一个公式开始:

程序=算法+数据结构  

这是由N.沃思(Niklaus  Wirth)(图灵奖获得者)提出,其将数据结构的功能形象化的展现出来。这个公式将在以后的学习中深深地印在每个编程学习者的脑海里。

那么什么是数据结构?

数据结构(Data Structure)相互之间存在一种或多种特定关系的数据元素的集合

看到这里,相必大家和作者有一样的想法:不就是集合吗?集合高一就学了,简单!但当我拿到课本,听了(非常认真)老师讲的第一节课后,我就很快打消以上念头,并在心里告诉自己:是我肤浅了!

几乎每本教材都对数据结构开了一篇绪论课!这代表着数据结构绝对是个重量级的选手!

看到这里,读者肯定在想:扯这么多废话,还不进入正题?

哈哈哈,其实作者也不想,作者目前也是数据结构初阶的学习,对这门课程也是充满了未知,但相信大家在一起交流学习,一定能够深刻理解这门课程!下面还是需要引入一些必要知识,有助下面章节的学习。

1.电子计算机的主要用途

早期:       主要用于数值计算。

后来:       处理逐渐扩大到非数值计算领域,能处理多种复杂的具有一定结构关系的数据

2.那如何求解非数值计算的问题?    

设计出合适的数据结构及相应的算法 即:首先要考虑对相关的各种信息如何表示、组织和存储

数据结构的研究内容为: 研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作。

3.数据结构主要涉及领域及地位

image.gif编辑

4.数据结构的基本概念

image.gif编辑

image.gif编辑

5. 数据结构分类image.gif编辑

image.gif编辑

存储结构是逻辑结构在计算机内的映像

二、算法

1.算法定义

一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列.

2. 算法的描述

(1)自然语言  (2)流程图 (3)程序设计语言 (4 伪码 (5)类C

image.gif编辑

image.gif编辑

image.gif编辑

image.gif编辑

3. 算法的特性  

输入  有0个或多个输入

输出 有一个或多个输出(处理结果)  

确定性 每步定义都是确切、无歧义的

有穷性 算法应在执行有穷步后结束  

有效性  每一条运算应足够基本

4. 算法的评价

正确性可读性 健壮性 高效性(时间代价和空间代价)

5. 算法的效率的度量

 算法效率:用依据该算法编制的程序在计算机上执行所消耗的时间来度量    

(1)事后统计 (2)事前分析估计

image.gif编辑

三、线性表

1.线性表的定义        

线性表由具有相同类型有限多个数据元素组成的一个有序序列

对于线性表,常用的基本运算用抽象数据类型描述如下

ADT List {

数据集合D:D={a1, a2,…, an},n≥0,D中的元素是DataType类型

数据关系R:R={r},r={ <ai, ai+1>| i=1,2,…,n-1}

基本操作P:

InitList(&L) :线性表的初始化。 操作结果:构造一个空的线性表L。

InsertList(&L,i ,x) 插入操作。

初始条件: 线性表L存在,插入位置1≤i≤n+1(n为插入前的表长),

操作结果:在线性表L的第i个位置插入一个值为x的新元素,插入后的表长加1。

DeleteList(&L,i):删除操作。

初始条件:线性表L存在,删除位置1≤i≤n(n为删除前的表长),

操作结果:在线性表L删除第i个位置的数据元素,删除后的表长减1。

IsEmptyList(L)判断线性表是否为空。

初始条件:线性表L存在,

操作结果:若线性L为空,则返回值1;否则返回值0。

LocationList(L,x):查找值为x结点位置。

初始条件:线性表L存在,已知数据元素x,

操作结果:若在L中找到第一个和x值相匹配的数据元素,则返回它在L中的位置;否则返回-1。

LengthList(L):求线性表L的表长。

初始条件:线性表L存在,

操作结果:返回线性表中所含元素的个数。

} ADT List;

image.gif编辑

2. 线性表之顺序表

线性表采用顺序存储的方式存储就称之为顺序表

2.1 顺序表的存储

image.gif编辑

image.gif编辑

image.gif编辑

2.2 线性表的顺序存储结构示意图

image.gif编辑

假设顺序表的每个结点占用k个内存单元,用location (ai)表示顺序表中第i个元素的存储地址。则有:    location (ai+1) = location (ai) +k    location (ai) = location(a1) + (i-1)*k  其中,location(a1)是线性表的第一个元素a1的存储地址,也称线性表的起始位置或基地址。

2.3顺序表的类型定义

//顺序表类型定义
#define MAXSIZE 100     //MAXSIZE是根据实际问题定义的足够大的整数常量
typedef int DataType;
typedef struct{ 
   DataType  data[MAXSIZE];
   int  length; 
 }SqList;     //定义顺序表类型
image.gif

定义一个顺序表语句:SqList L;

L是顺序变量,L.data表示顺序表的基地址,顺序表中的数据元素a1~an分别存放在L.data[0]~L.data[n-1]中,L.length表示顺序表的当前长度。

2.4 顺序表的初始化算法

//顺序表的初始化算法
void InitSqList(SqList & L)
{
    L.length=0;
}
image.gif

2.5 顺序表的插入算法

image.gif编辑

线性表插入x前后的状态

//顺序表的插入算法
void InsertSqList(SqList &L,int  i,DataType  x)
{  int j; 
    if(L.length==MAXSIZE)
    {   printf("\n顺序表是满的,无法插入元素!");
        exit(1);
    } 
    if(i<1||i>L.length+1)
    {  printf("\n指定的插入位置不存在!");
        exit(1);
    } 
    for(j=L.length-1;j>=i-1;j--) 
        L.data[j+1]=L.data[j]; 
    L.data[i-1]=x;
    L.length++; 
}
image.gif

2.6顺序表的删除算法

image.gif编辑

删除操作前后的状态

//顺序表的删除算法
void DeleteSqList(SqList &L,int  i)
{  if(L.length==0) 
    {  printf("\n顺序表是空的,无法删除元素!");
        exit(1);
    }
    if(i<1||i>L.length)
    {  printf("\n指定的删除位置不存在!");
        exit(1);
    }
    for(j= i;j< L.length;j++) 
        L.data[j-1]=L.data[j]; 
    L.length--; 
}
image.gif

2.7 顺序表的按值查找

给定数据x,在顺序表L中查找第一个与它相等的数据元素。如果查找成功,则返回该元素在表中的位置;如果查找失败,则返回-1。

//顺序表的按值查找算法
 int  LocationSqList(SqList L, DataType x) 
{  for (i=0; i<L.length; i++)     
  if (L.data[i] == x)        //查找成功,返回元素位置i     
   return i+1;     
 if (i == L.length)          //查找失败,返回-1      
  return -1; }
image.gif

2.8顺序表的排序算法

例1有顺序表A和B,其元素均按从小到大的升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。   算法思路:

void merge(SqList A, SqList B, SqList &C)
{    int i,j,k;
      i=0;j=0;k=0;
      while (i<=A.length-1 && j<=B.length-1)
         if (A.data[i]<B.data[j])
            C.data[k++]=A.data[i++];
         else
            C.data[k++]=B.data[j++];
     while (i<=A.length-1)
         C.data[k++]=A.data[i++];
      while (j<=B.length-1)
         C.data[k++]=B.data[j++];
      C.length=k;
}
image.gif

2.9 顺序表的逆置算法

例2:有一线性表的顺序表示 (a1,a2,… ,an) ,设计一算法将该线性表逆置成逆线性表(an,an-1,… ,a1),要求用最少的辅助空间。    算法思路:

//顺序表的逆置算法
void ReverseSqList(SqList &L)
{ //将线性表逆置,入口参数:指向顺序表的指针,返回值:无
      int i;
      DataType x;
      for (i=1; i<=L.length/2;i++)
      {
        x=L.data[i-1];    //完成元素ai与an-i+1交换
        L.data[i-1]=L.data[L.length-i];
        L.data[L.length–i]=x;
      }
}
image.gif

image.gif编辑

2.10 线性表的存储结构种类

(1)顺序存储结构(顺序表)

(2)链式存储结构(链表)

 

●本文只浅显的探讨了顺序表的基本知识,后续会进行链表的知识探讨。作者相信随着学习课程的深入,我们将会在对数据结构有更深的理解与收获!

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

相关文章
|
3月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
94 1
|
3月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
81 4
|
3月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
63 4
|
3月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
63 4
|
4天前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
|
22天前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
1月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
42 7
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
41 5
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
41 5
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5

热门文章

最新文章