数据结构(二)

一、复习

1、顺序表

​ 逻辑结构:线性结构

​ 存储结构:顺序存储

#define N 50
typedef int data_t;
typedef struct seqlist
{
    data_t data[N];
    int last;  //表尾指针,记录最后一个元素的下标
}Seqlist;

完成顺序表剩下功能:查找、修改、清空、删除表

二、顺序表

特点:

​ 查找和修改效率高

​ 插入和删除效率比较低

​ 空间利用率低

三、链表 – 单向链表

​ 逻辑结构:线性结构

​ 存储结构:链式存储

​ 链表节点相关表示:

typedef int data_t;
typedef struct node
{
  	data_t data;  //数据域,用于存放节点数据
    struct node *next;  //指针域,指向下一个节点的地址
}Node;

​ 有头链表:第一个节点无效

​ 无头链表:第一个节点有效

/*===============================================
*   文件名称:main.c
*   创 建 者:     
*   创建日期:2024年03月21日
*   描    述:
================================================*/
#include "seqlist.h"

int main(int argc, char *argv[])
{ 
	Seqlist *list = Seqlist_Create();
	
	for(int i = 0; i < 10; i++)
	{
		Seqlist_Insert_Pos(list, i, i);
	}
	
	Seqlist_Show(list);
	Seqlist_Insert_Pos(list, 5, 100);
	Seqlist_Insert_Pos(list, 2, 100);
	Seqlist_Insert_Pos(list, 5, 100);
	Seqlist_Show(list);
	/*
	Seqlist_Delete_Pos(list, 0); 
	Seqlist_Show(list);
	
	Seqlist_Delete_Pos(list, 0); 
	Seqlist_Show(list);
	data_t data = Seqlist_Search_Pos(list, 4);
	printf("data = %d\n", data);
	*/
	int arr[N] = {0};
	int len = Seqlist_Search_Data(list, 1000, arr);
	for(int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	
	Seqlist_Update_Pos(list, 0, 999);
	Seqlist_Show(list);
	Seqlist_Update_Data(list, 100, 200);
	Seqlist_Show(list);
	
	//Seqlist_Clear(list);
	//Seqlist_Show(list);
	Seqlist_Destory(&list);
	Seqlist_Show(list);
	
    return 0;
} 
/*===============================================
*   文件名称:seqlist.c
*   创 建 者:     
*   创建日期:2024年03月21日
*   描    述:
================================================*/
#include "seqlist.h"

/*********** 创建表 ************/
Seqlist *Seqlist_Create()
{
    Seqlist *list = (Seqlist *)malloc(sizeof(Seqlist));  //给顺序表开辟空间
    if(NULL == list)
    {
        printf("malloc failed!\n");
        return NULL;
    }

    list->last = -1;  //表示该表目前为空表
    
    return list;
}

/************* 判满 ****************/
int Seqlist_Is_Full(Seqlist *list)
{
	if(list->last == N-1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
/************** 判空 ***************/
int Seqlist_Is_Empty(Seqlist *list)
{
	if(list->last == -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


/************* 插入元素 ***************/
void Seqlist_Insert_Pos(Seqlist *list, int pos, data_t new_data)
{
	if(Seqlist_Is_Full(list) == 1)          //判断表是否为空
	{
		printf("seqlist is full!\n");
		return;
	}
	
	if(pos < 0 || pos > list->last+1)       //判断位置是否有错误
	{
		printf("inser_pos error!\n");
		return;
	}
	
	for(int i = list->last; i >= pos; i--)   //从pos位置开始,到last位置结束,所有元素向后移动一个元素空间大小
	{
		list->data[i+1] = list->data[i];
	}
	
	list->data[pos] = new_data;   //将新的元素插入pos位置
	list->last++;   //表尾指针+1
	
	return;
}


/***************** 按位置删除元素 ******************/
void Seqlist_Delete_Pos(Seqlist *list, int pos)
{
	if(Seqlist_Is_Empty(list) == 1)   //判空
	{
		printf("seqlist is empty!\n");
		return;
	}
	
	if(pos < 0 || pos > list->last)   //判断位置是否有效
	{
		printf("delete_pos error!\n");
		return;
	}

	for(int i = pos; i < list->last; i++)   //移动元素
	{
		list->data[i] = list->data[i+1];
	}
	
	list->last--;   //表尾指针-1
}

/************* 按位置查找 ***************/
data_t Seqlist_Search_Pos(Seqlist *list, int pos)
{
	if(Seqlist_Is_Empty(list) == 1)
	{
		printf("seqlist is empty!\n");
		return -1;
	}
	if(pos < 0 || pos > list->last)
	{
		printf("pos error!\n");
		return -1;
	}
	
	return list->data[pos];

}

/*************** 按位置查找 ***************/
int Seqlist_Search_Data(Seqlist *list, data_t data, data_t *arr)
{
	int count = 0;
	for(int i = 0; i <= list->last; i++)
	{
		if(list->data[i] == data)
		{
			arr[count] = i;
			count++;
		}
	}
	return count;
}

/*************** 按位置修改 *****************/
void Seqlist_Update_Pos(Seqlist *list, int pos, data_t new_data)
{
	if(Seqlist_Is_Empty(list) == 1)
	{
		printf("seqlist is empty!\n");
		return;
	}
	if(pos < 0 || pos > list->last)
	{
		printf("pos error!\n");
		return;
	}	
	
	list->data[pos] = new_data;
	
	return;
}  

/**************** 按值修改 ******************/
void Seqlist_Update_Data(Seqlist *list, data_t old_data, data_t new_data)
{
	if(Seqlist_Is_Empty(list) == 1)
	{
		printf("seqlist is empty!\n");
		return;
	}	
	
	for(int i = 0; i <= list->last; i++)
	{
		if(list->data[i] == old_data)
		{
			list->data[i] = new_data;
		}
	}
	return;
}  

void Seqlist_Clear(Seqlist *list)//清空表
{
	list->last = -1;
	return;
}

void Seqlist_Destory(Seqlist **a) //销毁表 
{
	free(a);   
	a = NULL;
	return;
}

/**************** 打印表 ****************/
void Seqlist_Show(Seqlist *list)  
{
	for(int i = 0; i <= list->last; i++)
	{
		printf("%d ", list->data[i]);
	}
	printf("\n");

}

/*===============================================
*   文件名称:seqlist.h
*   创 建 者:     
*   创建日期:2024年03月21日
*   描    述:
================================================*/
#ifndef __SEQLIST_H__
#define __SEQLIST_H__

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

#define N 50
typedef int data_t;
typedef struct seqlist
{
    data_t data[N];
    int last;   //记录最后一个元素的下标
}Seqlist;

Seqlist *Seqlist_Create();  //创建顺序表

int Seqlist_Is_Full(Seqlist *list); //判满

int Seqlist_Is_Empty(Seqlist *list); //判空
void Seqlist_Insert_Pos(Seqlist *list, int pos, data_t new_data);  //插入元素

void Seqlist_Delete_Pos(Seqlist *list, int pos);  //按位置删除元素

data_t Seqlist_Search_Pos(Seqlist *list, int pos); //按位置查找

int Seqlist_Search_Data(Seqlist *list, data_t data, data_t *arr); //按位置查找

void Seqlist_Update_Pos(Seqlist *list, int pos, data_t new_data);  //按位置修改

void Seqlist_Update_Data(Seqlist *list, data_t old_data, data_t new_data);  //按值修改

void Seqlist_Clear(Seqlist *list); //清空表

void Seqlist_Destory(Seqlist **list); //销毁表 

void Seqlist_Show(Seqlist *list);  //打印表



#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式石油工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值