数据结构第1天

完成对数据的增删改查

头文件:包含头文件引用、宏定义、函数定义、结构体定义

#ifndef __FUNC_H_
#define __FUNC_H_

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

typedef int dataType;
#define N 5

typedef struct{
	dataType data[N];
	int pos;
}Seq;

Seq* create_seq();
void insert_seq(Seq* list,dataType num,int index);
void detelt_seq(Seq* list,int index);
void tarver_seq(Seq* list);
void seq_change(Seq* list,int n,dataType num);
void seq_find(Seq* list,int n);
void seq_find(Seq* list,int n);
void seq_changeByData(Seq* list,dataType oldNum,dataType newNum);

#endif

功能函数:创建结构体空间

//创建
Seq* create_seq()
{
	Seq *list=(Seq*)malloc(sizeof(Seq));
	memset(list,0,sizeof(Seq));
	return list;
}

功能函数:判断是否为空是否为满,删除时判断空,插入时判断满

//判断是否为空
int Seq_empty(Seq* list){
	return list->pos==0?1:0;
}

//判断是否已满
int Seq_isFull(Seq* list){
	return list->pos==N?1:0;
}

功能函数:插入数据(包括从尾部插入、从指定下表位置插入)

//插入
void insert_seq(Seq* list,dataType num,int index)
{
	if(Seq_isFull(list)){
		printf("空间已满,无法插入\n");
		return;
	}
	if(index>list->pos || index<0){
		printf("不能在此处插入\n");
		return;
	}
	for(int i=list->pos;i>index;i--){ //从pos位置把前一个数据同步给后面的空间
		list->data[i]=list->data[i-1]; //将index那个下标位置的空间空出来
	}
	list->data[index]=num;
	list->pos++;
	return;
}

功能函数:删除(包括从尾部删除、从指定下标位置删除)

//删除
void detelt_seq(Seq* list,int index)
{
	if(Seq_empty(list)){
		printf("无法删除,数组为空\n");
		return;
	}
	if(list->pos<=index||index<0){
		printf("不能删除顺序表以外的数据\n");
		return;
	}
	printf("deteltData=%d\n",list->data[index]);
	for(int i=index;i<list->pos-1;i++){ //从index位置将后一个覆盖到前一个的空间
		list->data[i]=list->data[i+1]; //将index空间覆盖完成删除
	}
	list->pos--;
	return;
}

功能函数:根据指定下标匹配数据进行修改

//修改
void seq_change(Seq* list,int n,dataType num)
{
	if(list->pos<n||n<0){
		printf("修改失败,内容不在顺序表内\n");
		return;
	}
	list->data[n]=num;
	printf("changeData=%d\n",list->data[n]);
	return;
}

功能函数:根据指定下标查找对应的内容

//查询
void seq_find(Seq* list,int n)
{
	if(list->pos<n||n<0){
		printf("查询失败,内容不在数据表内\n");
		return;
	}
	printf("findData=%d\n",list->data[n]);
	return;
}

功能函数:遍历数据

//遍历
void tarver_seq(Seq* list)
{
	for(int i=0;i<list->pos;i++){
		printf("%d ",list->data[i]);
	}
	putchar(10);
}

功能函数:根据数据值查找对应内容

//按数据查找
void seq_findByData(Seq* list,dataType num)
{
	int flag=1;
	for(int i=0;i<list->pos;i++){
		if(num==list->data[i]){
			printf("%d下标为%d\n",num,i);
			flag=0;
		}
	}
	if(flag)
		printf("未查找到%d\n",num);
	return;
}

功能函数:根据数据值修改对应内容

//按数据修改
void seq_changeByData(Seq* list,dataType oldNum,dataType newNum)
{
	int flag=1;
	for(int i=0;i<list->pos;i++){
		if(oldNum==list->data[i]){
			list->data[i]=newNum;
			flag=0;
		}
	}
	if(flag)
		printf("未找到%d,修改失败\n",oldNum);
	return;
}

主函数代码:

#include "./03_func.h"

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

	//插入
	insert_seq(list,100,0);
	insert_seq(list,200,1);
	insert_seq(list,100,1);
	insert_seq(list,400,2);
	
	//按下标查找与修改
	seq_change(list,0,1000);
	seq_find(list,2);

	//删除
	detelt_seq(list,1);

	//遍历
	tarver_seq(list);
	
	//按数据查找与修改
	seq_changeByData(list,400,999);
	seq_findByData(list,999);
	return 0;
}

删除重复数据(将先出现的数据与后面的数据对比,如果有重复的将后面的数据删除)顺序表中原有:1221134324534541
顺序表中存储:12345

思路:1、两层循环,第一层循环取数组里的每一个数

2、数组里的每一个数去跟后面的数比较

3、如果和指定的数相等就调用数组前移的函数,将那个相等的数覆盖,同时index减一

头文件

#ifndef __func_h__

#define __func__h_

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

#define N 30

typedef struct{
	int pos;
	int arr[N];
}List;

List* create_list();
void tra_list(List* list);
void Delete_repData(List* list);

#endif

功能函数:创建结构体

//创建结构体
List* create_list()
{
	List* list=(List*)malloc(sizeof(List));
	return list;
}

功能函数:遍历结构体

//遍历结构体
void tra_list(List* list)
{
	for(int i=0;i<list->pos;i++){
		printf("%d ",list->arr[i]);
	}
	putchar(10);
	printf("pos=%d\n",list->pos);
	return;
}

功能函数:数据成片前移

//结构体数据前移
void move_listData(List* list,int num)
{
	for(int i=num;i<list->pos-1;i++){
		list->arr[i]=list->arr[i+1];
	}
	list->pos--;
	return;
}

功能函数:数据去重

//结构体数组去重
void Delete_repData(List* list)
{
	int i,j;
	for(i=0;i<list->pos-1;i++){ //将每个数据拿出来作比较,比到pos的前一个就可以确定了,因为最后一个数没有可以比较的了
		j=i+1; //将后面的一个数用来作比较
		while(j<list->pos){ //直到pos-1时结束
			if(list->arr[i]==list->arr[j]){ //满足条件时调用函数,while防止成片的相同数据
				move_listData(list,j);
			}else{ //直到对比到没有相同的才继续往后对比
				j++;
			}
		}
	}
	return;
}

主函数:

#include "./03_func.h"

int main(int argc, const char *argv[])
{
	List* list=create_list(); //创建结构体

	int arr[16]={1,2,2,1,1,3,4,3,2,4,5,3,4,5,4,1};
	for(list->pos=0;list->pos<sizeof(arr)/sizeof(arr[0]);list->pos++){
		list->arr[list->pos]=arr[list->pos]; //将数组放入结构体
	}
	
	tra_list(list); //遍历数组
	Delete_repData(list); //数组去重

	tra_list(list); //遍历数组
	return 0;
}

执行make命令,运行结果:

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值