数据结构(二)
一、复习
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