数据结构(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)链式存储结构(链表)

 

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

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

相关文章
|
12天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
1天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
10 3
|
12天前
|
存储 算法 C语言
【趣学C语言和数据结构100例】
《趣学C语言和数据结构100例》精选5个编程问题,涵盖求最大公约数与最小公倍数、字符统计、特殊序列求和及阶乘计算等,通过实例讲解C语言基础与算法思维,适合初学者实践学习。
|
21天前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
27 6
|
21天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
18 2
|
21小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
24天前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
20 1
|
21天前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
50 0
|
25天前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
30 0
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
283 8