数据结构day3(顺序表)

存储结构/物理结构:逻辑结构在计算机的存储形式

1.顺序存储:使用一段任意的连续的存储空间存储数据元素【数组】

逻辑相邻,物理也相邻

2.链式存储:使用任意一块空间存储数据元素【银行取钱】

逻辑相邻,物理不一定相邻

3.散列存储:哈希存储,哈希表,计算机的存储位置个关键字有一定的对 应关系。

哈希表主要的作用实现查找

4.索引存储:由索引表和数据文件组合实现的一种查找方式

 head.h

#ifndef __A_H__
#define __A_H__

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

typedef int datedef;

#define MAX 10
typedef struct // 创建顺序表结构
{
    datedef date[MAX];

    int len;
} Seqlist, *seqlist;

typedef struct // 创建顺序表结构
{
    datedef date[MAX * 2];

    int len;
} Seqlist1, *seqlist1;

seqlist creat(); // 创建顺序表

seqlist1 creat1(); // 创建顺序表

int pE(seqlist list); // 判空
int pM(seqlist list); // 判满

int pE1(seqlist1 list); // 判空

int insert(seqlist list, int q); // 尾插

int output(seqlist list);   // 输出
int output1(seqlist1 list); // 输出

int del(seqlist list);                      // 尾删
int search(seqlist list, int n);            // 查找
int update(seqlist list, int w, datedef e); // 修改

int mid_s(seqlist list, int n, datedef e); // 中间插入(前置)
int mid_del(seqlist list, int n);          // 中间删除

int p_search(seqlist list, datedef e);            // 位置查找
int p_del(seqlist list, datedef e);               // 元素删除
int p_update(seqlist list, datedef a, datedef e); // 元素修改
int p_dd(seqlist list);                           // 元素去重

int p_insert(seqlist list, datedef a, datedef e); // 某元素后插入
int bubble(seqlist list);                         // 排序

void toget(seqlist a, seqlist b, seqlist1 c); // 有序表排序

typedef int datedef;

#endif

fun.c

#include "head.h"

seqlist creat() // 创建顺序表
{
    seqlist list = (seqlist)malloc(sizeof(Seqlist));
    if (list == NULL)
        return NULL;
    list->len = 0;
    return list;
}

seqlist1 creat1() // 创建顺序表
{
    seqlist1 list1 = (seqlist1)malloc(sizeof(Seqlist1));
    if (list1 == NULL)
        return NULL;
    list1->len = 0;
    return list1;
}

int pE(seqlist list) // 判空
{
    return list->len == 0 ? -1 : 0;
}

int pE1(seqlist1 list) // 判空
{
    return list->len == 0 ? -1 : 0;
}

int pM(seqlist list) // 判满
{
    return list->len >= MAX ? -1 : 0;
}

int insert(seqlist list, int q) // 尾插
{
    if (list == NULL || pM(list))
    {
        printf("创建失败!\n");
        return -1;
    }

    list->date[list->len] = q;
    list->len++;
}

int output(seqlist list) // 输出
{
    if (list == NULL || pE(list))
    {
        printf("输出失败!\n");
        return -1;
    }
    for (int i = 0; i < list->len; i++)
    {
        printf("date[%d]=%d\t", i + 1, list->date[i]);
    }
    puts("");
}

int output1(seqlist1 list) // 输出
{
    if (list == NULL || pE1(list))
    {
        printf("输出失败!\n");
        return -1;
    }
    for (int i = 0; i < list->len; i++)
    {
        printf("c[%d]=%d\t", i + 1, list->date[i]);
    }
    puts("");
}

int del(seqlist list) // 尾删
{
    if (list == NULL || pE(list))
        return -1;
    list->len--;
}

int search(seqlist list, int n) // 查找
{
    if (list == NULL || pE(list) || n < 1 || n > list->len)
    {
        printf("查找失败!\n");
        return -1;
    }
    printf("查找到元素为:%d\n", list->date[n - 1]);
}

int update(seqlist list, int n, datedef e) // 修改
{
    if (list == NULL || pE(list) || n < 1 || n > list->len)
    {
        printf("操作失败!\n");
        return -1;
    }
    list->date[n - 1] = e;
}

int mid_s(seqlist list, int n, datedef e) // 中间插入
{
    if (list == NULL || pM(list) || n < 1 || n > list->len + 1)
    {
        printf("操作失败!\n");
        return -1;
    }
    for (int i = list->len; i > n - 1; i--)
    {
        list->date[i] = list->date[i - 1];
    }
    list->date[n - 1] = e;
    list->len++;
}

int mid_del(seqlist list, int n) // 中间删除
{
    if (list == NULL || pE(list) || n < 1 || n > list->len + 1)
    {
        printf("操作失败!\n");
        return -1;
    }
    for (int i = n - 1; i < list->len; i++)
    {
        list->date[i] = list->date[i + 1];
    }
    list->len--;
    return 0;
}

int p_search(seqlist list, datedef e) // 位置查找
{
    if (list == NULL || pE(list))
    {
        printf("顺序表不存在。\n");
        return -1;
    }
    int b = 0;
    for (int i = 0; i < list->len; i++)
    {
        if (list->date[i] == e)
        {
            b = i + 1;
            return b;
            break;
        }
    }
    if (b > list->len)
        return -1;
}

int p_del(seqlist list, datedef e) // 元素删除
{
    int n = p_search(list, e);
    mid_del(list, n);
    printf("操作完成\n");
    return 0;
}

int p_update(seqlist list, datedef a, datedef e) // 元素修改
{
    int n = p_search(list, a);
    update(list, n, e); // 修改
    printf("操作完成\n");
    return 0;
}

int p_dd(seqlist list) // 元素去重
{
    if (list == NULL || pE(list))
    {
        printf("操作失败\n");
        return -1;
    }
    for (int i = 0; i < list->len - 1; i++)
    {
        for (int j = i + 1; j < list->len; j++)
        {
            if (list->date[i] == list->date[j])
            {

                mid_del(list, j + 1); // 中间删除
                j--;
            }
        }
    }
    printf("操作完成\n");
    return 0;
}

int p_insert(seqlist list, datedef a, datedef e) // 某元素后插入
{
    int n = p_search(list, a);
    if (n == -1)
    {
        printf("没有该元素\n");
        return -1;
    }
    mid_s(list, n + 1, e); // 中间插入
    printf("操作完成\n");
    return 0;
}

int bubble(seqlist list) // 排序
{
    if (list == NULL || pE(list))
    {
        printf("操作失败\n");
        return -1;
    }
    for (int i = 1; i < list->len; i++)
    {
        int count = 0;
        for (int j = 0; j < list->len - i; j++)
        {
            if (list->date[j + 1] < list->date[j])
            {
                datedef k = list->date[j];
                list->date[j] = list->date[j + 1];
                list->date[j + 1] = k;
                count++;
            }
        }
        if (count == 0)
            break;
    }
    printf("操作完成\n");
    return 0;
}

void toget(seqlist a, seqlist b, seqlist1 c) // 有序表排序
{

    int i = 0, j = 0;
    while (i < a->len && j < b->len && !pE(a) && !pE(b))
    {
        if (a->date[i] <= b->date[j])
        {
            c->date[c->len] = a->date[i];
            i++;
            c->len++;
        }
        else if (a->date[i] > b->date[j])
        {
            c->date[c->len] = b->date[j];
            j++;
            c->len++;
        }
    }
    while (i < a->len || j < b->len)
    {
        if (j < b->len)
        {
            c->date[c->len] = b->date[j];
            j++;
            c->len++;
        }
        else if (i < a->len)
        {
            c->date[c->len] = a->date[i];
            i++;
            c->len++;
        }
    }
}

main.c 

#include "head.h"
int main()
{

    seqlist list = creat();

    int n;
    datedef e;
    printf("输入元素个数:");
    scanf("%d", &n);
    if (n > MAX)
        n = MAX;
    for (int i = 0; i < n; i++)
    {
        printf("要输入的元素是:");
        scanf("%d", &e);
        insert(list, e);
    }

    output(list);
    /*
    del(list);
    output(list);

    printf("你要查找的元素是第几个?");
    scanf("%d",&n);
    search(list,n);

    printf("你要修改的元素是第几个?");
    scanf("%d",&n);
    printf("你要将该元素改为:");
    scanf("%d",&e);
    update(list,n,e);
    output(list);

    printf("你要在第几个位置插入?");
    scanf("%d",&n);
    printf("你要将该元素改为:");
    scanf("%d",&e);
    mid_s(list,n,e);   //中间插入(前置)
    output(list);

    printf("你要删除的元素是第几个?");
    scanf("%d",&n);
    mid_del(list,n);   //中间删除
    output(list);


    printf("你要查找的元素为:");
    scanf("%d",&e);
    n=p_search(list,e);   //位置查找
    if(!n)
    {
    printf("该元素不存在\n");
    }
    else if(n!=-1)
    {
      printf("该元素在第%d个。\n",n);
    }
    */

    /*
    printf("你要删除的元素为:");
    scanf("%d",&e);
    p_del(list,e);   //元素删除
    output(list);
    */
    /*
    datedef a;
    printf("你要修改的元素为:");
    scanf("%d",&a);
    printf("你要将该元素改为:");
    scanf("%d",&e);
    p_update(list,a,e);   //元素修改
    output(list);


    p_dd(list);        //元素去重
    output(list);
    */

    datedef a;
    printf("你要插入的前一个元素为:");
    scanf("%d", &a);
    printf("你要插入的元素为:");
    scanf("%d", &e);
    p_insert(list, a, e); // 元素前插入
    output(list);

    bubble(list); // 排序
    output(list);

    seqlist list1 = creat();

    printf("输入元素个数:");
    scanf("%d", &n);
    if (n > MAX)
        n = MAX;
    for (int i = 0; i < n; i++)
    {
        printf("要输入的元素是:");
        scanf("%d", &e);
        insert(list1, e);
    }

    bubble(list1); // 排序
    output(list1);

    seqlist1 c = creat1();
    toget(list, list1, c);

    output1(c);

    free(list);
    list = NULL;
    free(list1);
    list1 = NULL;
    free(c);
    c = NULL;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值