数据结构入门学习之顺序表

谈到数据结构,大家应该都不陌生吧,这几乎是每个计算机行业的学生,大一必修的一门课程,基本上和c语言一样,一开始学习都是挺让人懵逼的,简直摸不着头脑。但是不管怎么样,这些课程很重要,而且是必修的,也许初识,你并不会了解到这带给你的作用有多大,但是越是深入学习,你就会很需要这个。

学习线性表之前,我们先了解一些线性表的特性。

特征:

1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有 唯一的后继(后件)。
4.除第一个元素之外,均有 唯一的前驱(前件)。

 

结构:

线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。
顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequential mapping)。它以“物理位置相邻”来表示线性表中数据元素间的逻辑关系,可随机存取表中任一元素。
链式表示指的是用一组任意的存储单元存储线性表中的数据元素,称为线性表的链式存储结构。它的存储单元可以是连续的,也可以是不连续的。在表示数据元素之间的逻辑关系时,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分信息组成数据元素的存储映像,称为结点(node)。它包括两个域;存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称为指针或链。


问题:张老师让libero使用顺序表编程实现一个学生情况表,包含4个字段,分别为学号,姓名,性别,年龄。依次输入,并显示出来。

问题分析:上面有4个字段信息,很显然在程序中,我们要定义一个结构体,分别包含以上字段,然后对这个结构体输入班级信息,并输出,为了简化编程,我们可以定义一个SeqList.h的头文件,在这上面定义顺序表的增删查改。

//顺序表的实现
#include "stdio.h"
#include "math.h"
//#define MaxSize 10
//typedef int DataType;
typedef struct
{
    DataType list[MaxSize];
    int size;
} SeqList;

//初始化列表
void ListInitiate(SeqList *L)
{
    
    L->size = 0;
}

//得到列表的大小
int ListLength(SeqList *L)
{
    return L->size;
}

int ListInsert( SeqList *L, int i, DataType x)
{
    int j;
    if ( L->size >= MaxSize )
    {
        printf("顺序表已经满了无法插入!/n");
        return 0;
    }
    else if ( i<0 || i>L->size)
    {
        printf("参数不合格!");
        return 0;
    }
    else
    {
        for (j=L->size;j>i;j--)
        {
            L->list[j] = L->list[j-1];
        }
        L->list[i] = x;
        L->size++;
        return 1;
    }
}

int ListDelete( SeqList *L, int i , DataType *x)
{
    int j;
    if ( L->size <=0 )
    {
        printf("顺序表已经空!/n");
        return 0;
    }
    else if ( i<0 || i>=L->size)
    {
        printf("参数不合格!");
        return 0;
    }
    else
    {
        *x = L->list[i];
        for ( j = i;j < L->size-1; j++ )
        {
            L->list[j] = L->list[j+1];
        }
        L->size--;
        return 1;
    }
}

int ListGet (SeqList *L, int i, DataType *x)
{
    if ( i<0 || i>L->size-1)
    {
        printf("参数不合格!");
        return 0;
    }
    else
    {
        *x=L->list[i];
        return 1;
    }
}

定义了顺序表的相关处理函数,现在我们可以来处理程序的主体部分。

#include <stdio.h>
#define MaxSize 100
typedef struct Student
{
    long number;        //学号
    char name[10];      //姓名
    char sex[3];            //性别
    int age;                   //年龄
}StudentType;

typedef StudentType DataType;

#include "seqlist.h"

int main(int argc, char *argv[])
{
    
    //编程实现一个学生情况表,包含4个字段,分别为学号,姓名,性别,年龄。依次输入,并显示出来。
    
    SeqList myList;
    int i;
    
    StudentType inputS[3]=
    {
        {01,"zs","n",6},
        {02,"ls","n",8}
    };
    
    StudentType student;
    //初始化mylists
    ListInitiate(&myList);
    ListInsert(&myList,0,inputS[0]);
    ListInsert(&myList,1,inputS[1]);
    
    printf("ID\tName\tSex\tAge \n");
    for(i=0;i<ListLength(&myList);i++)
    {
        ListGet(&myList,i,&student);
        printf("%d\t%s\t%s\t%d \n",student.number,student.name,student.sex,student.age);
    }
    
    
    
    return 0;
}

顺序表,上面用一个简单的案例说明了整个过程,大家有不懂得可以直接留言。如果一个代码也看不懂的话,那估计你是没救了,建议大家买一本C语言从入门到精通好好研究一下。

 

您可能还喜欢...

想说点什么吗?

您将是第一位评论人!

提醒
avatar