【五星】西安交通大学《算法设计与问题求解》教材代码&详解补充【顺序表】A分类

顺序表

采用顺序存储结构的线性表称为顺序表,它的数据元素按照逻辑顺序依次存放在一组连续的存储单元中

逻辑上相邻的数据元素,其存储位置也彼此相邻

顺序表可采用结构体类型描述

结构体

A不涉及typedef的结构体

//结构体的定义(不涉及typedef)
struct Student
{
  int a;
  double b;
};

//和int y类似,定义了一个struct Student类型的变量
struct Student LiHua;  

B使用typedef的结构体

//结构体定义框架(涉及typedef,typedef用来起别名)
//int char 数组 指针
typedef struct 名称1  //type define
{
   属性1;  //int a;
   属性2;  //char b;
}别名;


//举例:
typedef struct Student  //大部分名称1可以省略,除了结构体内部有指向自己的指针
{
  int a;
  double b;
}xuesheng;

xuesheng LiHua;


//举例:大部分名称1可以省略,除了有指向自己的指针
typedef struct LNode
{
  int data;
  struct LNode*next;
}LNode;

LNode head;  //定义一个LNode内型的变量
LNode *p;  //定义一个LNode类型的指针
p=&head;  //指针指向head

head.data=5;  //通过变量取里面的值
p->data=4;  //通过指针取里面的成员

教材中对线性表的定义

顺序表sqList

typedef int DataType;
typedef struct sqList  //定义线性表的结构
{
  DataType* sqList;  //指向线性表的指针
  int length;  //表长(从1开始记数)  
  int maxLength;  //表容量(从1开始记数)
}sqList;

构造顺序表利用一维数组存储元素,线性表长度经常变化,实际长度就是表长length,但是数组的长度是固定的,为了容纳顺序表,一维数组的长度应该足够大,最大长度maxLength,length的初始长度为0,也就是空表,最大长度不超过maxLength;

int length;  //表长(从1开始)
int maxLength;  //表容量(从1开始)

结构体中list指针指向元素存储空间,该空间是DataType类型的一维数组,长度为maxLength,这个空间需要在创建线性表的函数中动态创建,数组下标从0到maxLength-1;

DataType* List;  //指向线性表的指针

DataType是某种数据类型的另一种表示,就是别名,可以作为整型,长整型,浮点型,字符串结构体或类等等的别名

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称

typedef int DataType;

DataType表示int类型,下面这两行代码完全等价

int a;
DataType a;

1.设计一个元素类型为整数的顺序表

#include<stdio.h>
#include<stdlib.h>

//将整数int重定义为DataType(重命名)
typedef int DataType;

//定义线性表的结构
typedef struct List
{
  DataType* list;  //指向线性表的指针
  int length;  //表长
  int maxLength;  //表容量
}ListType;

头文件<stdlib.h>的补充解释

#include<stdlib.h>

malloc函数,free函数也被包含在这个头文件中

2.创建一个新的线性表,参数是线性表的最大容量length,成功返回指向该表的指针,否则返回NULL

ListType* CreatList(int length)  
//返回类型为ListType*的指针型变量,函数名称为CreatList,函数参数为int类型的length
{
  
  ListType* sqList=(ListType*)malloc(sizeof(ListType));  //通过指针定义一个结构体 
//创建ListType*的指针型变量sqList,并通过malloc函数为其分配内存空间,大小为ListType结构体的大小

  if(sqList!=NULL)  //检查内存是否分配成功,如果sqList不为NULL,则表示内存分配成功
  {
   
     sqList->list=(DataType*)malloc(sizeof(DataType)*length);
     //为线性表的数据组list分配内存空间,大小为DataType类型的大小乘以length
   
     if(sqList->list==NULL)
       return NULL;
     //如果内存分配失败,返回NULL
     
     sqList->length=0;
     //将线性表的长度初始化为0,此时线性表为空表
    
     sqList->maxLength=length;
     //将线性表的最大长度设置为传入参数length的值
   }
   
return sqList;
//返回创建好的线性表的指针sqList

}

上面的代码片段,使用两次malloc函数是为了分配内存给线性表的结构和数据数组

第一个malloc函数调用用于分配线性表结构所需的内存空间,ListType是一个结构体类型,包含了线性表的相关信息,如长度,容量,通过调用malloc,我们可以在堆内存中动态分配足够的空间来存储该结构体

具体语法:

ListType* sqList=(ListType*)malloc(sizeof(ListType));

第二个malloc函数用于分配线性表中数据数组所需要的空间,数据数组的类型是DataType,length是数组的期望长度

具体语法:

sqList->list=(DataType*)malloc(sizeof(DataType)*length);

3.销毁线性表,参数是指向需要销毁的线性表的指针,不需要返回值

void DestroyList(ListType*pList)
{
  free(pList->list);
}

4.置空线性表,参数是指向需要置空线性表的指针,不需要返回值

void ClearList(ListType*pList)
{
  Plist->length=0;
}

5.检测线性表是否为空,参数是指向线性表的指针,如果线性表为空返回1;否则返回0

int IsEmptyList(ListType*pList)
{
  return pList->length==0?1:0;
}

6.获取线性表的指针,参数是指向线性表的指针,返回线性表的长度

int GetListLength(ListType*pList)
{
  return pList->length;
}

7.获取线性表中第n个元素,参数是指向线性表的指针pList,要获取元素在线性表中的位置,如果获取成功,将取得元素放进data中,获取成功返回1,失败返回0

int GetListElement(ListType*pList,int n,DataType* data)
{
  if(n||n>pList->length-1)  //验证n位置的有效性
    return 0;
  *data=pList->list[n];  //将指定位置的元素值赋值给data
  return 1;
}

8.从pos起查找data第一次出现的位置,参数是指向线性表的指针pList,查找的起始位置pos,要查找的元素data,找到则返回该位置,未找到则返回-1

int FindElement(ListType*pList,int pos,DataType data)
{ 
   for(int n=pos;n<pList->length;n++)
  {
    if(data==pList->list[n])  //查找指定元素
       return n;  //返回元素位置
  }
 return -1;
}

9.获取第n个元素的前驱,参数是指向元素的指针pList,n的前驱,获取成功,将元素存放于data中,找到则返回前趋的位置(n-1),未找到则返回-1

int GetPriorElement(ListType*pList,int n,DataType* data)
{
  if(n<1||n>pList->length-1)
    return -1;
  *data=pList->list[n-1];
  return n-1;
}

10.获取第n个元素的后继,参数是指向线性表的指针pList,n的后继,获取成功将元素存在data中,找到则返回后继位置(n+1);未找到则返回-1

int GetNextElement(ListType*pList,int n,DataType*data)
{
  if(n<0||n>pList->length-2)
   return -1;
  *data=pList->list[n+1];
  return n+1;
}

11.将data插入到线性表的pos位置处,参数是指向线性表的指针pList,插入的位置pos,要插入的元素存放在data中,成功则返回

int insertToList(ListType*pList,int pos,DataType data)
{
  //如果插入的位置不正确或者线性表已满,则插入失败
  if(pos<0||pos>pList->length||pList->length==pList->maxLength)
    return -1;
  
  //从pos开始,所有元素向后移动一位
  for(int n=pList->length;n>pos;--n)
   {
     pList->list[n]=pList->list;
   }
  
  //插入新元素
  pList->list[pos]=data;
  
  //表长增加1
  return ++pList->length;
}

12.将pos位置处的元素删除,参数是指向线性表的指针pList,删除元素的位置pos,成功则返回新的表长,失败返回-1

int DeleteFromList(ListType*pList,int pos)
{
  判断插入位置的合法性
  if(pos<0||pos>pList->length)
    return -1;
  
  将pos后的元素向前移动一个单位
  for(int n=pos;n<pList->length-1;n++)
  {
    pList->list[n]=pList->list[n+1];
  }
  return --pList->length;
}

13.输出线性表,参数是指向线性表的指针

void PrintList(ListType*pList)
{
  for(int n=0;n<pList->length;++n)
  printf("第%d项:%d\n",n,pList->list[n]);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挣钱钱暴富富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值