线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的.

这种数据元素的逻辑结构的特征如下:

1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素.

2.第一个元素无前驱元素,但有后继元素.

3.最后一个元素有前驱元素,单无后继元素.

可以抽象为如下表述:

元素1 元素2 元素3 元素4 元素5 元素6

然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)

                 2.在内存中离散存储的线性表-----链表(如单链表,双链表)

对于顺序表有多重操作:初始化,赋值,插入新值,删除值等

下面的用C代码实现顺序表及其一些常用的操作

#include<stdio.h>

#define ERROR 0

#define InitSize 20 //顺序表的初始大小

typedef int ElemType;

typedef struct{
    ElemType data[InitSize];
    int length;
}sqlist;

//顺序表初始化
void InitList(sqlist *L)
{
    L->length=0;
    return ;
}

//获取顺序表的长度
int GetLength(sqlist *L)
{
    return L->length;
}

//顺序表赋值
void GiveValue(sqlist *L)
{
    int value;
    int i=0;
    while(value!=0)
    {
        printf("Please input %d valueL-------(exit until value equal 0)\n",i+1);
        scanf("%d",&value);
        if(value!=0)
        {
            L->data[i++]=value;
            L->length++;
        }
    }
}

//获取顺序表某个位置的值
ElemType GetValue(sqlist *L,int i)
{
    ElemType e;
    if(i>L->length||i<1)
        return ERROR;

    int k=0;
    for(k=0;k<L->length;k++)
    {
        if(k==i-1)
        e=L->data[k];
    }
    return e;
}

//获取顺序表某个值的位置
int GetPos(sqlist *L,ElemType value)
{
    int pos;
    int judeflag=1;
    int i;
    for(i=0;i<L->length;i++)
    {
        if(L->data[i]==value)
        {
            pos=i+1;
            break;
        }
        judeflag++;
    }

    if(judeflag>=L->length)
        return ERROR;

    return pos;
}

//在顺序表指定位置插入新的值
void InsertValue(sqlist *L,int pos,ElemType value)
{
    if(pos<1||pos>L->length)
        return ERROR;

    int i;
    for(i=L->length-1;i>pos-2;i--)
    {
        L->data[i+1]=L->data[i];
    }

    L->data[pos]=value;
    L->length++;
}

//在顺序表中指定位置删除值
void DeleteValue(sqlist *L,int pos)
{
    if(pos<1||pos>L->length)
        return ERROR;

    int i;
    for(i=pos;i<L->length;i++)
    {
        L->data[i-1]=L->data[i];
    }

    L->length--;
}

//显示顺序表
void ShowList(sqlist *L)
{
    int i;
    printf("The List show below:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%d ",L->data[i]);
    }
}

//主函数
int main()
{
    sqlist L;
    InitList(&L);//初始化顺序表
    GiveValue(&L);//顺序表赋值
    ShowList(&L);//显示线性表

    printf("\n\n\n\n");
    int flag;
    printf("******************************************************\n");
    printf("*************choose the operation of List*************\n");
    printf("*****************1-指定位置插入值*********************\n");
    printf("*****************2-指定位置删除值*********************\n");
    printf("*****************3-获取顺序表某个值得位置*************\n");
    printf("*****************4-获取顺序表某个位置上的值*********\n");
    printf("*****************5-获取顺序表长度*********************\n");
    printf("*****************0-退出*******************************\n");
    printf("******************************************************\n");
    printf("\n\n\n");

    printf("Input the value Flag:\n");
    scanf("%d",&flag);

    printf("flag=%d\n",flag);

    int pos,value,len;
    switch(flag){
    case 1:
        {
            printf("Please input the value and position:\n");
            scanf("%d %d",&value,&pos);
            printf("Insert value=%d in pos=%d\n",value,pos+1);
            InsertValue(&L,pos,value);
            ShowList(&L);
            break;
        }
    case 2:
        {
            printf("Please input the position:\n");
            scanf("%d",&pos);
            printf("Delete value in pos=%d\n",pos);
            DeleteValue(&L,pos);
            ShowList(&L);
            break;
        }
    case 3:
       {
            printf("Please input the value:\n");
            scanf("%d",&value);
            pos=GetPos(&L,value);
            printf("Get value=%d's position is %d\n",value,pos);
            ShowList(&L);
            break;
       }
    case 4:
        {
            printf("Please input the position:\n");
            scanf("%d",&pos);
            value=GetValue(&L,pos);
            printf("Get value=%d from pos=%d\n",value,pos);
            ShowList(&L);
            break;
        }
    case 5:
        {
            len=GetLength(&L);
            printf("the length of List is %d\n",len);
            ShowList(&L);
            break;
        }
    case 0:
        printf("you choose to exit\nGoodbye!\n");
    }

    return 0;
}

结果图:

转载请注明作者:小刘

线性表之顺序表(C语言实现)

时间: 2024-11-09 18:06:53

线性表之顺序表(C语言实现)的相关文章

[C++] 数据结构(C):线性表之顺序表

1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + Status GetElement(SeqList L, int i, ElementType &e) (按位)取值  + int LocateElement(SeqList L, ElementType e) (按值)查找  + Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入  + Status ListDelet

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

线性链表之顺序表

顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 特点:顺序存取,随机访问. /* Name: SeqList Copyright: 1.0 Author: Johnny Zen Date: 04/06/17 21:51 Description: 线性链表之顺序表 *//* Chinese:顺序(线性)表 English:SeqList*/#in

线性表之顺序表C++实现

线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件#include<iostream> const int MaxSize = 100;//定义顺序表SeqList的模板类template<class DataType>class SeqList{public: //顺序表无参构造器(创建一个空的顺序表) SeqList(){ length = 0 } //顺序表有参构造器(创建一个长度为n的顺序表) SeqList(DataType array[], int

【算法和数据结构】_17_小算法_线性结构:顺序表

/* 本程序用来测试数据结构中的线性结构:顺序表 */ #include <stdio.h> #include <stdlib.h> #define LINEAR_MAX_SIZE 64 struct LinearList { int* List; //顺序表指针 unsigned short int ListLen; //顺序表最大的元素个数 unsigned short int CurrentLen; //顺序表当前元素的个数 }; typedef struct LinearL

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

C#线性表之顺序表

线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素: (2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是一个接一个的排列.因此,可以把线性表想象为一种数据元素序列的数据结构. 线性表的接口如下所示. public interface I

数据结构Java实现02----线性表与顺序表

[正文] 本节内容: 线性结构 线性表抽象数据类型 顺序表 顺序表应用 一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有后继数据元素. 则称这样的数据结构为线性结构. 二.线性表抽象数据类型: 1.线性表抽象数据类型的概念: 线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合. 数据集合: 可以表示为a0,a1,a2,...a