当前位置:   article > 正文

C语言 线性表的基本操作_c语言如何对表赋值

c语言如何对表赋值

一、线性表的定义

线性表是一种最常用也是最简单的数据结构。简单来讲,一个线性表是n个数据元素的有限排列,在不同情况下,每个数据元素有着不同的含义。

二、线性表的组成

一个线性表的结构体由三部分组成:1.线性表中的元素(Elem)2.线性表的当前长度(Length)3、线性表当前分配的储存空间大小(ListSize,通常情况下ListSize>Length)

三、头文件以及数据的定义

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


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

#define LIST_INIT_SIZE   100
#define LISTINCREMENT    10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

使用typedefdefine是为了提高程序的可读性。

四、线性表的具体操作

1.结构体创建

typedef struct
{
    ElemType *elem;     //线性表的基地址
    int length;         //线性表的当前长度
    int listsize;       //线性表当前储存空间大小
}SqList;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.构建新线性表

第一步:使用malloc函数为线性表动态分配内存空间,由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。

Status InitList(SqList *L)
{
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;         
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!L->elem)
    {
        printf("储存空间分配失败\n");
        exit(OVERFLOW);
    }
    printf("一个空的线性表已经构建成功\n");
    return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.对线性表进行赋值

对线性表的大小进行赋值,如果超过原来的大小,则使用realloc函数重新分配大小。

Status ValueList(SqList *L)
{
    int i,j;
    printf("请输入线性表元素的个数: ");
    scanf("%d",&i);

    if(i > L->listsize)
    {
        while(1)
        {
            if(i > L->listsize)
            {
                L->elem = (ElemType *)realloc(L->elem,LISTINCREMENT * sizeof(ElemType));
                L->listsize += LISTINCREMENT;
            }
            else break;
        }
    }
    for(j = 0; j < i;j++)
        {
            printf("请输入第%d个元素:   ",j+1);
            scanf("%d",&L->elem[j]);
        }
        L->length = i;
        printf("赋值成功\n");
        return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4.销毁线性表

Status ClearList_Sq(SqList *L)
{
    if(L->elem)
    {
        L->length = 0;
        printf("线性表已重置\n");
        return OK;
    }
    else
        printf("线性表不存在,无法重置\n");
        return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5.向线性表中插入元素

插入的原理是确认插入位置后,将插入位置上及之后的元素向后移动一位。在这里,定义指针q,并将指针q赋值为当前插入位置的元素。利用for循环,向后移动元素,最后还要将数组长度扩大一位。

Status ListInsert(SqList *L)
{
    int i;
    int e;
    ElemType *newbase;
    int *q,*p;
    printf("请输入插入的位置:   ");
    scanf("    %d",&i);
    if(i < 1 || i > L->length+1)
    {
        printf("error\n");
        return ERROR;
    }
    if(!newbase)
    {
        printf("储存空间分配失败\n");
        exit(OVERFLOW);
    }
    printf("请输入插入的元素    ");
    scanf("   %d",&e);
    if(L->length >= L->listsize)
    {
        newbase = (ElemType * )realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(ElemType));
        L->elem = newbase;
        L->listsize += LISTINCREMENT;
    }
    q = &(L->elem[i-1]);

    for(p = &(L->elem[L->length - 1]);p >= q;--p)
        *(p+1) = *p;
        *q = e;
        ++L->length;
    return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

6.删除元素

与插入元素的原理类似

Status DeleteList(SqList *L)
{
    int i;
    printf("请输入删除元素的位置");
    scanf("     %d",&i);
    if(i < 1 || i > L->length)
    {
        printf("error\n");
        return ERROR;
    }
    int *p,*q;
    p = &(L->elem[L->length-1]);
    for(q = &(L->elem[i-1]);q < p;q++)
        *q = *(q+1);
        --L->length;
    return OK;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

7.打印线性表中的元素

Status PrintList(SqList *L)
{
    printf("线性表的长度是%d\n",L->length);

    printf("当前的元素是  ");
    for(int k = 0;k<L->length;k++)
    {
        printf("\t%d\t",L->elem[k]);
    }
    printf("\n");
    return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如有需要改进的地方,请各位大佬在评论区留言,谢谢大家。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/529464
推荐阅读
  

闽ICP备14008679号