数据结构(C语言版)第二章线性表之顺序存储结构

本文详细介绍了线性表的定义与特点,包括线性结构的三个关键属性,线性表长度与数组长度的区别,以及顺序表的随机存储特性。同时,提供了线性表顺序存储结构的基本操作实现,如初始化、销毁、重置、判断空表、获取长度、查找元素等,并解释了在单链表中删除尾节点的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、线性表的类型定义
1、线性结构的特点:在数据元素的非空有限集合中,
(1)存在唯一的一个“第一个”或“最后一个”数据元素;
(2)除第一个元素外,每个数据元素只有一个前驱;
(3)除最后一个元素外,每个数据元素只有一个后继;

2、线性表中的元素是多种多样的,但同一线性表中的元素必定有相同的特性,相邻数据元素之间存在序偶关系。

3、线性表长度与数组长度的区别:
(1)线性表长度是指线性表中数据元素的个数,随着线性表的插入和删除操作,这个量是变化的;
(2)数组长度是指存放线性表的存储空间的长度,在存储分配后这个量一般是不会改变的;
(3)线性表的长度 ≤ 数组长度

易错点:1、顺序表具有随机存储特性,指的是查找序号为i的元素与顺序表中元素个数n无关;
2、在长度为n的单链表中,删除尾节点的时间复杂度是O(n);

二、线性表顺序存储结构的基本操作

#include<stdio.h>
#include<stdlib.h>
#define maxsize 1024
typedef struct
{
   int data[maxsize];
   int length;
}sqlist;
/*初始化构造一个空表L*/
/*当length=0时表示表为空*/
int InitList(sqlist *L)
{
    memset(L->data,0,sizeof(L));//初始化数据为0
    L->length=0;                //初始化长度为0
    return 0;
}
/*销毁线性表L*/
/*当length=0时线性表为空*/
int DestroyList(sqlist *L)
{
   L->length=0;
}
/*将线性表重置为空表*/
int ClearList(sqlist *L)
{
   while(!L->data)
      free(L->data)
   L->length=0;
   return 0;
}
/*判断线性表是否为空表*/
/*若L为空表,则返回ture[1],否则返回false[0]*/
int ListEmpty(sqlist L)
{
   int i;
   i=ListLength(L);
   if(i==0)
     return 0;
   return 1;
}
/*返回中数据元素的个数*/
int ListLength(sqlist L)
{
   return L.length;
}
/*返回L中第i个数据元素的值*/
int GetElem(sqlist L,int i)
{
   /*条件判断是否在范围内,i从1开始,没有第0个的说法*/
   if(i<1 || L.length==0 || i>L.length)
        return -1else
      return L.data[i-1];
}
/*查找线性表中是否存在某个值*/
int LocateElem(sqlist L,int e)
{
   int i; 
   for(i=0;i<L.length;i++)
   {
      if(L.data[i]==e)
         return i+1;
   }
   return -1;
}
/*寻找某个非第一个元素的前驱*/
int PriorElem(sqlist L,int e)
{
  int i;
  if(L.lenght==0)
      return 0;
  for(i=1;i<L.length;i++)
  {
     if(L.data[i]==e)
        return L.data[i-1];
  }
  return -1;
}
/*寻找某个非最后一个元素的后继*/
int NextElem(sqlist L,int e)
{
  int i;
  if(L.length==0)
     return 0;
  for(i=0;i<L.length-1;i++)
  {
    if(L.data[i]==e)
        return L.data[i+1];
  }
  return -1;
}
/*在第i个位置前插入元素e*/
int InsertElem(sqlist *L,int i,int e)
{
   if(L->length>=Maxsize || i<1 || i>L->length+1)
      return 0;
   int k;
   for(k=L->length-1;k>=i-1;k--)
   {
     L->data[k+1]=L->data[k];
   }
   L->data[i-1]=e;//插入元素
   L->length++;//表长增加1;
   return 1;
/*删除指定位置的元素*/
int DeletElem(sqlist *L,int i)
{
    if(i>L->length || i<1 || L->length==0)//不在删除范围内
        return 0;
     int k;
     for(k=i-1;k<L->length-1;k++)
     {
        L->data[k]=L->data[k+1];
     }
     L->length--;
     return 1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值