哈工大数据结构与算法 作业1——线性结构的存储结构与应用(SeqList)

该文章详细介绍了线性表的三种基本存储结构——顺序表、单链表和静态链表,并提供了C语言实现,包括初始化、插入、删除、查找、逆置、删除重复元素、循环移动和合并排序线性表等算法。同时,作者反思了代码设计中的不足,如变量命名、输入提示和注释规范等问题。

作业题目:线性表的基本存储结构的实现与应用

顺序表与单链表是线性表的两种最基本的存储结构,而静态链表是两者的 完美结合,是系统进行动态存储分配的方法基础。线性表的这三种存储结构不但是其他数据结构(如树形结构、图型结构、集合等)存储方法的重要基础,同时本身也有广泛的应用。

作业要求

1. 实现线性表的顺序存储结构(SeqList)和链式存储结构(LinkList)。
2. 在上述存储结构的基础上,分别实现以下算法:
① 删除给定元素的算法。
② 对于已排好序的线性表,删除所有重复元素的算法。
③ 线性表“逆置”算法。
④ 线性表循环左移/右移 k 位的算法。
⑤ 合并两个已排好序的线性表的算法。
3. 选做:(可以不做,供学有余力、有兴趣的同学探索)
① 你能实现线性表的静态链表存储结构吗?
② 你能在静态链表上实现线性表的“逆置”算法吗?

存储结构

#define maxlength 100
#define ElemType int
typedef struct
{
    ElemType elem[maxlength];//下标为0的单元不存放线性表中元素
    int last;//最后一个元素在数组中位置
}SeqList;

部分基本操作

初始化线性表 

读取初始化时元素的个数,依次将各个元素加入到线性表中,当输入元素个数大于等于maxlength时提示"Too many elements !!"。

void Assign_Initial_Value(SeqList *L)
{
    int num=maxlength+1,i;
    printf("Please input the number of elements:");
    while(num>=maxlength)//元素个数最多为maxlength-1
    {
        scanf("%d",&num);
        if(num>=maxlength)
        {
            printf("Too many elements !!\n");
        }
    }
    printf("Input them:");
    for(i=1;i<=num;i++)
    {
        scanf(" %d",&L->elem[i]);
    }
    L->last=num;
    printf("success !!\n");
}

End(L)  返回最后一个元素的后一位置

给int定义别名position便于区分是否用于表示元素位置。

typedef int position
position End(SeqList L)
{
    return (L.last+1);
}

插入(在p位置插入元素x)

课本(数据结构与算法(第五版)高等教育出版社 张岩等主编)中代码使用C++语法,用'&'进行引用传递。如果使用C语言,可以考虑把'&'使用'*'替换,函数调用时,用'&'传址。

插入新元素,对插入元素位置及其后面元素依次后移即可。

不要忘记对L->last进行加1操作。

void Insert (ElemType x ,position p ,SeqList *L)
{
    position q;
    if(L->last>=maxlength-1)//x插入前表已满
    {
        printf("List is full !!");
    }
    else if((p>L->last+1)||p<1)//x插入位置错误
    {
        printf("position does not exist !!");
    }
    else
    {
        for(q=L->last;q>=p;q--)
        {
            L->elem[q+1]=L->elem[q];//位置p后元素逐个后移
        }
        L->elem[p]=x;
        L->last++;//勿忘
    }
}

删除给定位置的元素

勿忘对L->last进行减1操作

void Delete(position p,SeqList *L)
{
    position q;
    if((p>L->last)||(p<1))
    {
        printf("position does not exist !!");
    }
    else
    {
        for(q=p;q<=(L->last);q++)
        {
            L->elem[q]=L->elem[q+1];
        }
        L->last--;
    }
}

打印线性表

void Print(SeqList*L)
{
    int i;
    for(i=1;i<=L->last;i++)
    {
        printf("%d  ",L->elem[i]);
    }
    printf("\n");
}

查找某个元素(查找某个元素第一次出现的位置)

position Locate(ElemType x,SeqList *L)
{
    printf("Input the element you want to find:");
    scanf(" %d",&x);
    position q;
    for(q=1;q<=(L->last);q++)
    {
        if(L->elem[q]==x)
            return q;
    }
    return (L->last+1);//找不到则返回最后元素后一位置
}

作业中算法

1.删除给定元素的算法

该函数中调用了基本操作中的删除某一位置元素函数

void Delete_Element(ElemType x,SeqList *L)
{
    int i=1;
    while(i<=L->last)
    {
        if(L->elem[i]==x)
        {
            Delete(i,L);
        }
        else
            i++;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值