数据结构第一天

        利用顺序表存储数据,实现数据表的创建,增删改查,利用index下标增删改查,以及顺序表的去重等。

主函数:01_seq_main.c

#include "./03_seq_func.h"

//打印选项并返回选择
int show()
{
	printf("-------------------------------------\n");
	printf("      <------1. 插入数据------->\n");
	printf("      <------2. 删除数据------->\n");
	printf("      <------3. 修改数据------->\n");
	printf("      <------4. 查询数据------->\n");
	printf("      <------5. 下标插入数据--->\n");
	printf("      <------6. 下标删除数据--->\n");
	printf("      <------7. 下标修改数据--->\n");
	printf("      <------8. 下标查询数据--->\n");
	printf("      <------9. 显示所有数据--->\n");
	printf("      <------10. 去重---------->\n");
	printf("      <------11. 退出---------->\n");
	printf("请输入>>>");
	int choose;
	scanf("%d", &choose);
	return choose;
}

int main(int argc, const char *argv[])
{
	// 创建顺序表
	Seq *list = create_seq();

	int choose = 0;
	int data, new_data, index;

	// 测试使用数据
	insert_seq(list, 1);
	insert_seq(list, 2);
	insert_seq(list, 2);
	insert_seq(list, 1);
	insert_seq(list, 1);
	insert_seq(list, 3);
	insert_seq(list, 4);
	insert_seq(list, 3);
	insert_seq(list, 2);
	insert_seq(list, 4);
	insert_seq(list, 5);
	insert_seq(list, 3);
	insert_seq(list, 4);
	insert_seq(list, 5);
	insert_seq(list, 4);
	insert_seq(list, 1);

	while (1)
	{
		// 打印选项并返回选择
		choose = show();

		switch (choose)
		{
		case 1:
			// 插入数据
			printf("请输入要插入的数据>>>");
			scanf("%d", &data);
			insert_seq(list, data);
			break;
		case 2:
			// 删除数据
			delete_seq(list);
			break;
		case 3:
			// 修改数据
			printf("请输入要修改的旧数据和新数据>>>");
			scanf("%d%d", &data, &new_data);
			update_seq(list, data, new_data);
			break;
		case 4:
			// 查询数据
			printf("请输入要查询的数据>>>");
			scanf("%d", &data);
			query_seq(list, data);
			break;
		case 5:
			// 下标插入数据
			printf("请输入要插入的数据和下标>>>");
			scanf("%d%d", &data, &index);
			insert_seq_index(list, index, data);
			break;
		case 6:
			// 下标删除数据
			printf("请输入要删除的数据的下标>>>");
			scanf("%d", &index);
			delete_seq_index(list, index);
			break;
		case 7:
			// 下标修改数据
			printf("请输入要修改的数据和下标>>>");
			scanf("%d%d", &data, &index);
			update_seq_index(list, index, data);
			break;
		case 8:
			// 下标查询数据
			printf("请输入要查询的下标>>>");
			scanf("%d", &index);
			query_seq_index(list, index);
			break;
		case 9:
			// 显示所有数据
			show_seq(list);
			break;
		case 10:
			// 去重
			unique_seq(list);
			break;
		case 11:
			// 退出
			free(list);
			exit(0);
			break;
		default:
			printf("选项输入错误,请重新输入!\n");
		}
	}

	return 0;
}

功能函数:02_seq_func.c

#include "./03_seq_func.h"

// 创建顺序表
Seq *create_seq()
{
    Seq *list = (Seq *)malloc(sizeof(Seq));
    memset(list, 0, sizeof(Seq));

    return list;
}

// 判断顺序表是否为满,为满返回1,否则返回0
int is_Full(Seq *list)
{
    return list->pos >= N ? 1 : 0;
}

// 判断顺序表是否为空,为空返回1,否则返回0
int is_Null(Seq *list)
{
    return list->pos <= 0 ? 1 : 0;
}

// 在尾部插入数据,成功返回0,失败返回1
int insert_seq(Seq *list, dataType data)
{
    if (list->pos < N)
    {
        list->data[list->pos] = data;
        list->pos++;
        printf("%d插入成功!\n", data);
    }
    else
    {
        printf("顺序表已满,无法插入%d\n", data);
        return -1;
    }
    return 0;
}

/*
函数功能:根据index下标插入数据
函数参数:Seq *list顺序表 int index插入位置 dataType data插入内容
函数返回值:int 成功返回0,失败返回1
*/
int insert_seq_index(Seq *list, int index, dataType data)
{
    // 判断index位置是否有效
    if (index < 0 || index > list->pos)
    {
        printf("%d位置无法插入!\n", index);
        return -1;
    }

    // 判断顺序表是否为满
    if (is_Full(list))
    {
        printf("顺序表已满,无法插入%d\n", data);
        return -1;
    }

    int i;
    for (i = list->pos; i > index; i--)
    {
        list->data[i] = list->data[i - 1];
    }
    list->data[index] = data;
    list->pos++;

    printf("%d插入成功!\n", data);
    return 0;
}

// 删除尾部数据,成功返回0,失败返回-1
int delete_seq(Seq *list)
{
    // 判断顺序表是否为空
    if (is_Null(list))
    {
        printf("顺序表为空,删除失败!\n");
        return -1;
    }

    list->pos--;
    printf("%d删除成功!\n", list->data[list->pos]);
    return 0;
}

/*
函数功能:根据index下标删除数据
函数参数:Seq *list顺序表 int index删除位置的下标
函数返回值:int 成功返回0,失败返回1
*/
int delete_seq_index(Seq *list, int index)
{
    // 判断index位置是否有效
    if (index < 0 || index >= list->pos)
    {
        printf("无法删除下标%d!\n", index);
        return -1;
    }

    // 判断顺序表是否为空
    if (is_Null(list))
    {
        printf("顺序表为空,无法删除下标%d\n", index);
        return -1;
    }

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

    list->pos--;

    printf("下标%d删除成功!\n", index);

    return 0;
}

// 修改数据,将旧数据改为新数据,成功返回0,失败返回-1
int update_seq(Seq *list, dataType old_data, dataType new_data)
{
    // query_seq(list,data);可替换下列代码
    if (is_Null(list))
    {
        printf("顺序表为空,修改失败!\n");
        return -1;
    }
    int i, flag = -1;
    for (i = 0; i < list->pos; i++)
    {
        if (list->data[i] == old_data)
        {
            list->data[i] = new_data;
            flag = 0;
        }
    }
    if (flag == 0)
    {
        printf("成功修改%d为%d\n", old_data, new_data);
        return 0;
    }
    else
    {
        printf("顺序表中不存在%d,无法修改\n", old_data);
        return -1;
    }
}

// 根据index下标修改数据,成功返回0,失败返回-1
int update_seq_index(Seq *list, int index, dataType data)
{
    if (index < 0 || index >= list->pos)
    {
        printf("index=%d下标不合法,无法修改\n", index);
        return -1;
    }

    list->data[index] = data;
    printf("index = %d,修改成功\n", index);
}

// 查询数据,成功返回查询数据的下标,失败返回-1
int query_seq(Seq *list, dataType data)
{
    int i, flag = 0, p;
    if (is_Null(list))
    {
        printf("顺序表为空,%d查询失败!\n", data);
        return -1;
    }

    for (i = 0; i < list->pos; i++)
    {
        if (data == list->data[i])
        {
            printf("找到%d,下标为:%d\n", data, i);
            p = i;
            flag = 1;
        }
    }

    if (flag)
    {
        return p;
    }
    else
    {
        printf("顺序表中没有%d\n", data);
        return -1;
    }
}

// 根据下标查询数据,成功返回该数据,失败返回-1
dataType query_seq_index(Seq *list, int index)
{
    int i;

    if (is_Null(list))
    {
        printf("顺序表为空,下标%d查询失败!\n", index);
        return -1;
    }

    for (i = 0; i < list->pos; i++)
    {
        if (list->data[index] == list->data[i])
        {
            printf("找到%d,下标为:%d\n", list->data[index], i);
            return i;
        }
    }
}

// 显示所有数据
void show_seq(Seq *list)
{
    int i;
    printf("\ndata:\n");
    for (i = 0; i < list->pos; i++)
    {
        printf("%d\n", list->data[i]);
    }
}

// 顺序表去重
int unique_seq(Seq *list)
{
    int i, j;

    if (is_Null(list))
    {
        printf("顺序表为空,无法去重!\n");
        return -1;
    }

    for (i = 0; i < list->pos; i++)
    {
        for (j = i + 1; j < list->pos; j++)
        {
            if (list->data[i] == list->data[j])
            {
                delete_seq_index(list, j);
                j--;
            }
        }
    }

    printf("顺序表去重成功!\n");
    return 0;
}

头文件:03_seq_func.h

#ifndef __SEQ_FUNC__
#define __SEQ_FUNC__

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

#define N 16     //顺序表的大小
typedef int dataType;
typedef struct
{
    dataType data[N];
    int pos;
} Seq;

// 创建顺序表
Seq *create_seq();

// 在尾部插入数据,成功返回0,失败返回1
int insert_seq(Seq *list, dataType data);

/*
函数功能:根据index下标插入数据
函数参数:Seq *list顺序表 int index插入位置 dataType data插入内容
函数返回值:int 成功返回0,失败返回1
*/
int insert_seq_index(Seq *list, int index, dataType data);

// 删除尾部数据,成功返回0,失败返回-1
int delete_seq(Seq *list);

/*
函数功能:根据index下标删除数据
函数参数:Seq *list顺序表 int index删除位置的下标
函数返回值:int 成功返回0,失败返回1
*/
int delete_seq_index(Seq *list, int index);

// 修改数据,将旧数据改为新数据,成功返回0,失败返回-1
int update_seq(Seq *list, dataType data, dataType new_data);

// 根据index下标修改数据,成功返回0,失败返回-1
int update_seq_index(Seq *list, int index, dataType data);

// 查询数据,成功返回查询数据的下标,失败返回-1
int query_seq(Seq *list, dataType data);

// 根据下标查询数据,成功返回该数据,失败返回-1
dataType query_seq_index(Seq *list, int index);

// 显示所有数据
void show_seq(Seq *list);

// 顺序表去重
int unique_seq(Seq *list);

#endif

Makefile:

Makefile

-include ./makefile.cfg

$(Target):$(Obj)
	$(CC) $^ -o $@

%.o:%.c
	@$(CC) $< $(CAN) $@

.PHONY:clean

clean:
	rm $(Obj) $(Target)

 makefile.cfg

Target:=a.out
Obj:=01_seq_main.o 02_seq_func.o

CC:=gcc
CAN:=-c -o

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值