《数据结构》青岛大学--王卓 1.0线性表

所需要的基本C语言语法可以在这里找到

  1. 结构体
  2. 指针
  3. 指针在结构体的运用

线性表

在这里插入图片描述

定义和特征(随便看看就可以了)

在这里插入图片描述

  1. 判断是否位线性表 第一是元素具有相同特性,第二是数元素间的关系是线性关系
  2. 逻辑特征
    在这里插入图片描述

顺序存储结构线性表

  1. 相邻的元素存储位置也相邻
  2. 如果知道第一个元素地址 L O C ( a 1 ) LOC(a_1) LOC(a1),而且知道每一个元素占用多少空间 l l l,那么就知道第i个 L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) × l LOC(a_i)=LOC(a_1)+(i-1)\times l LOC(ai)=LOC(a1)+(i1)×l

顺序存储结构线性表操作

  1. 线性表(顺序表)的定义
#define MAXSIZE 1000    //定义最大长度

typedef struct
{        //定义图书基本信息
    char no[20];
    char name[20];
    float price;
}book;                  

typedef struct 
{
    book *elem;     //动态分配内存  
    int length;
}sqlist;
  • malloc 函数:malloc(m)表示开辟m字节长度,并返回这段空间首地址 ,所以要用指针变量来接收他。头文件是include <stdib.h>,如果分配成功就返回该内存地址,失败就返回NULL.另外,malloc不需要强制转换,因为它的原形是 void * malloc(size_t size),void *指针 可以转换其他类型。
  • 值传递有两种形式
    *在这里插入图片描述

*在这里插入图片描述

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 注意 C语言里面没有引用,c++里面才有后面的操作我会用C语言来重写

顺序表操作
1.顺序表初始化之前操作
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef char ElemType  ;
typedef int status;

typedef struct{
    ElemType *elem;
    int length;
}sqlist;
2.顺序表的初始化
status initlist_sq(sqlist *L)
{

    L->elem=(char *) malloc( sizeof(ElemType)*MAXSIZE);
    //(char *)是多余的,但是为了不让编译器警告,最好加上
    if(!L->length) exit(1);//exit(1)表示程序异常退出
    L->length=0;           
    return 0;             //程序正常一般返回0,有错误返回非0
}

在这里插入图片描述

3.顺序表的删除
void destroylist(sqlist *L)
{
   
    free(L);
    L=NULL;
    return ;        //void 函数 没有返回值,也可以不写
}

在这里插入图片描述

4.顺序表的清零
void clearlist (sqlist *L)
{
    L->length=0;   //将线性表长度变为0
    return ; 
}

在这里插入图片描述

5.求线性表长度
int getlength(sqlist *L)
{
    return (L->length+1); //length 开始值为0
}

在这里插入图片描述

6.判断顺序表是否为空
int isempty(sqlist *L)
{
    if (L->length==0)return 1;
    else return 0;
}

在这里插入图片描述

7.获取顺序表的值
int getelem(sqlist *L,int i)
{
    if(i<1||i>L->length ) //判断位置是否合理
    exit(1);
    return (L->elem[i-1]);
}

在这里插入图片描述

8.顺序表查找
int locateElem(sqlist *L,ElemType e)
{
    int i=0;
    for(i=0;i < L->length;i++)
    if(L->elem[i]==e) return i+1;
    return 0;
}

在这里插入图片描述

9.顺序表插入
status listinsert_sq(sqlist *L,int i,ElemType e)
{
    int j;
    if(i<1||i>L->length+1)
    exit(1);
    for(j = L->length;j>=i-1;j--)//注意,length是从0开始的,也就是可以看作数组下标
    L->elem[j+1]=L->elem[j];
    L->elem[i-1]=e;
    L->length++;
    return 0;
}

在这里插入图片描述

10.顺序表删除
status listdelete_sq(sqlist *L,int i)
{
    int j;
    if(i<1||i>L->length)
    exit(1);
    for (j=i;j<=L->length;j++)
    L->elem[j-1]=L->elem[j];
    L->length--;
    return 0;
}

在这里插入图片描述

11.主函数测试
int main()
{

    ElemType arr[]={0,1,2,3,4,5,6,7,8,9};
    sqlist *ptr=NULL;
    ptr=(sqlist *)malloc(sizeof(*ptr));
    initlist_sq(ptr);
   puts("1"); //检查initlist_sq()函数   
    if(isempty(ptr))
        for (int i=1;i<=9;i++)
        listinsert_sq(ptr,i,arr[i]);
    puts("2"); //检查initlist_sq()函数       
    printf("%d \n",getlength(ptr));
    printf("%d \n",getelem(ptr,9));
    listdelete_sq(ptr,9);
    printf("%d \n",getlength(ptr));
    destroylist(ptr);
    printf("all right!\n");
    system("pause");  //我用的vscode,这里暂停窗口
    exit(0);
}

结果
在这里插入图片描述

顺序表优缺点

  1. 优点:存储密度大,可以随机存取表中任一元素
  2. 缺点:在插入、删除某一个元素时,需要移动大量元素。浪费存储空间。属于静态存储形式,数据元素不能自由扩充
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值