顺序表-数据结构(C语言)

        目录

1. 环境配置
2. 顺序表的定义及其特点;
3. 顺序表的运算(概述);
4. 顺序表的实现(详细的介绍及C程序代码、执行结果);
5. 完整的Demo;
6. 小结;
7. 参考文献

一 环境配置
 vscode+MinWG/vc++6.0


二 顺序表的定义及其特点
定义:
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。采用顺序存储结构的线性表简称为“ 顺序表”

 注:
{采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 【1≤i≤n】 其中,L是元素占用存储单元的长度}

特点:
1.存储结构 (顺序表的存储结构是一段连续的内存空间,数据元素按照线性顺序存储,可以通过元素下标进行访问。)
2.固定大小 (顺序表的大小是固定的,一旦创建后就不能动态扩容或缩小,因此需要事先确定存储元素的个数)
3.访问速度快(由于顺序表的元素存储在连续的内存空间中,因此可以通过下标直接访问元素,访问速度较快。)
4.插入,删除操作效率低(由于顺序表的存储结构是连续的,因此在插入或删除元素时,需要将后续的元素全部向后或向前,移动效率较低)
5.适合静态存储数据(由于顺序表的大小是固定的,因此适合存储静态数据,不适合动态增删的情况)



三:顺序表的运算

顺序表是一种线性数据结构,可以进行多种运算操作。以下是基本的顺序表运算:

  1. 插入操作
  2. 删除操作
  3. 查找操作
  4. 更新操作
  5. 求长度操作

 内容分析:

定义顺序表结构体
typedef struct
{
	int length;//当前顺序表长度
	int Maxsize;//顺序表最大长度
	int* data;//定义顺序表中元素类型的数组指针
}SqList;

顺序表数据添加

顺序表搭建好了,之后往表上填数据。往顺序表-添加数据首先当然要判断一下表是否已满。如果表没有满,就往表中添加数据并且表的长度+1

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10

void InitList(SqList &L)
{
	L.data = (int *)malloc(InitSize*sizeof(int));//用malloc函数申请一片空间
	L.length = 0;//把顺序表的当前长度设为0
	L.Maxsize = InitSize;//这是顺序表的最大长度
}

顺序表操作

以上是顺序表的建立以及顺序表表尾添加数据的操作

以下是顺序表的操作:增,删,改,查

 插入数据:

元素插入有一些要求:
1.元素是插队到奇怪的位置
2.顺序表存储空间是否满了(

  数据插入(按位置查找)有三种情况:

       1.表的开始插入

       2.表的中间插入、

       3.表的结尾插入

void IncreaseSize(SqList &L)
{
	int len;
	int *p = L.data;//*p指向的地址和顺序表的首地址是一样的
	printf("请输入你要增加的顺序表的长度:");
	scanf("%d", &len);
	L.data = (int *)malloc((L.Maxsize + len)*sizeof(int));//新申请一片空间
	for (int i = 0; i < L.length; i++)
		L.data[i] = p[i];//把值一个个复制过去
	L.Maxsize = L.Maxsize + len;//顺序表最大长度增加len
	free(p);//释放空间
}

删除元素 :

元素删除有一些要求:
1.元素是否为表中的元素
2.顺序表存储空间是否为空

bool ListDelete(SqList &L)
{
	int i, e;
	printf("请输入要删除的元素位置:");
	scanf("%d",&i);
	if (i<1 || i>L.length + 1)//判断元素下标是否越界
		return false;
	if (!L.data)//判断是不是空表
	{
		printf("空表\n");
		return false;
	}
	e = L.data[i - 1];
	for (int j = i; j <= L.length; j++)
	{
		L.data[j-1] = L.data[j];
	}
	L.length--;//表长-1
	printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
	return true;
}

更新元素:

顺序表更改元素的要求:

  1. 找到目标元素
  2. 直接修改该元素的值
void UpdateListElement(SeqList *L, int pos, int new_val) {  
    if (pos < 0 || pos >= L->length) {  
        printf("Error: Invalid position\n");  
        return;  
    }  
    L->data[pos] = new_val;  
}

查找元素 :

顺序表的元素查找(按值查找)
顺序表按值查找,只能采用依次遍历的方法

void LocateElem(SqList &L)
{
	int e;
	int k = 1;
	printf("输入你要查找的元素:");
	scanf("%d", &e);
	for (int i = 0; i < L.length; i++)
	if (L.data[i] == e)
	{
		printf("找到了,是第%d个元素\n", i + 1);
		k = 0;
		break;
	}
	if (k)
		printf("找不到元素%d\n", e);
}

数据打印

bool PrintList(SqList &L)
{
	if (!L.data)//判断是不是空表
		return false;
	printf("顺序表里的元素有:");
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.data[i]);
	printf("\n");
	return true;
}

4. 顺序表的实现(详细的介绍及C程序代码、执行结果);

顺序表功能

顺序表的插入

顺序表的删除

顺序表的修改

顺序表的查找

5.完整的DEMO

完整的Demo

#include <stdio.h>

#define MAXSIZE 1000

/*顺序表的定义*/
typedef struct list
{
    int data[MAXSIZE];    /*存储空间,数组*/
    int length;            /*顺序表的长度*/
}SeqList;

int main(int argc, char* argv[])
{
    SeqList L;  /* 声明了一个顺序表L */
    int i, j, k;
    int x;

    /*初始化*/
    L.length = 0;
    printf("顺序表L初始化完成。\n");
    
    printf("1. 插入5个元素\n");
    /*插入一些元素, 采用尾插法,新插入元素放在最后*/
    for(i=0;i<5;i++)
    {
        printf("\t[%d].", i+1);
        scanf("%d", &x);
        /*尾插法*/
        L.data[L.length] = x;
        L.length++;
    }
    
    printf("输出顺序表L\n");

    for(i=0;i<L.length;i++)
    {
        printf("L(%d) = %d\n", i+1, L.data[i]);
    }
    
    printf("2. 在指定位置插入元素x\n");
    printf("请输入位置k:");
    scanf("%d", &k);
    printf("请输入元素x:");
    scanf("%d", &x);
    printf("正在检查位置k合法性...\n");

    if(k<1 || k>L.length+1)
    {
        printf("位置k不合法!\n");
        return 0;
    }
    printf("位置k检查结束,插入元素【%d】...\n", x);
    
    j=0;
    for(i=L.length;i>=k;i--)
    {
        j++;
        L.data[i] = L.data[i-1];
    }
    printf("  移动元素%d个\n", j);
    L.data[i] = x;
    L.length++;

    printf("输出新的顺序表L\n");

    for(i=0;i<L.length;i++)
    {
        printf("L(%d) = %d\n", i+1, L.data[i]);
    }

    printf("删除顺序表L第k个元素\n");
    printf("请输入位置k:");
    scanf("%d", &k);
    
    printf("正在检查位置k合法性...\n");

    if(k<1 || k>L.length)
    {
        printf("位置k不合法!\n");
        return 0;
    }
    printf("位置k检查结束,开始删除...\n");
    /*移动元素*/
    for(i=k;i<L.length;i++)
    {
        L.data[i-1] = L.data[i];
    }
    L.length--;

    printf("输出新的顺序表L\n");

    for(i=0;i<L.length;i++)
    {
        printf("L(%d) = %d\n", i+1, L.data[i]);
    }
    return 0;
}


/*
    SeqList.c 顺序表实现
*/
#include "SeqList.h"


/*顺序表初始化*/
int init(SeqList *L)
{
    L->length = 0;
    return 0;
}


/*顺序表的长度*/
int length(SeqList *L)
{
    return L->length;
}

/*顺序表是否满*/
int full(SeqList *L)
{
    return (L->length == MAXSIZE)?1:0;
}

/*是否空*/
int empty(SeqList *L)
{
    return (L->length == 0)?1:0;
}

/*插入元素*/
int insert(SeqList *L, int i, DataType x)
{
    int j;

    /*判断是否满*/
    if(full(L))
    {
        printf("Error[10001],顺序表已满!\n");
        return 10001;
    }
    /*判断位置i合法性*/
    if(i<1 || i>length(L)+1)
    {
        printf("Error[10002],位置i不合法!\n");
        return 10002;
    }

    /*移动元素,向后移动*/
    for(j=L->length;j>=i;j--)
    {
        L->data[j] = L->data[j-1];
    }
    L->data[j] = x;
    L->length++;
    return 0; /*ok!*/
}

/*删除元素*/
int delete(SeqList *L, int i, DataType *x)
{
    return 0;
}

/*输出顺序表*/
void print(SeqList *L)
{
    int i;

    if(empty(L))
    {
        printf("顺序表为空!");
        return ;
    }
    printf("顺序表为:");
    for(i=0;i<L->length;i++)
    {
        printf(" %d ", L->data[i]);
    }
    printf("\n");
}


#include <stdio.h>
#include "SeqList.h"
#include "welcome.h"

int main(int argc, char* argv[])
{
    SeqList L;
    int cmd;
    int i;
    int m,n;

    DataType x;
    
    for(i=0;i<strlen(welcome);i++)
    { 
        printf("%c",welcome[i]);
        for(m=0;m<10000;m++)
            for(n=0;n<1000;n++)
            {
                ;
            }
    }
    printf("\n\n\n");
    printf("-----------顺序表演示程序----------\n");
    do
    {
        printf("1. 初始化顺序表\n");
        printf("2. 插入元素\n");
        printf("3. 删除元素\n");
        printf("4. 判断顺序表是否为空\n");
        printf("5. 判断顺序表是否满\n");
        printf("6. 输出顺序表\n");
        printf("10. 帮助\n"); 
        printf("0. 退出\n");
        printf("请输入您要进行的操作(1~6,0退出):");
        scanf("%d", &cmd);
        switch(cmd)
        {
        case 1:
            if(!init(&L))
            {
                printf("顺序表已初始化!\n");
            }
            break;
        case 2:
            printf("请输入位置i,插入元素x(i,x):");
            scanf("%d,%d",&i,&x);
            if(!insert(&L,i,x))
            {
                printf("元素(%d)已插入位置[%d]\n",x, i);
            }
            break;
        case 5:
            if(full(&L))
            {
                printf("顺序表已满!\n");
            }
            else
            {
                printf("顺序表未满!\n");
            }
        case 6:
            print(&L);
            break;
        case 10:
            printf(" 本程序为顺序表的演示程序,有XXX设计开发,程序完成了。。。。功能!。。。\n");
            break;
            
        }
    }while(cmd != 0);

    return 0;
}

6. 小结;
关于这个阶段的学习,初步的了解了关于顺序表的概念性知识点一些事实性的操作。
除了这些之外也在复习了之前学的c语言内容,在以后的数据结构方面要下很多功夫。

7. 参考文献
1.百度百科
2.数据结构(C语言板)李刚 刘万辉
3.CSDN有关数据结构的内容
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值