数据结构02.13作业

数据结构顺序表的增删改查相关操作及代码

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

enum PASSBALY{SUCCESS,FALSE=-1};

#define MAXSIZE 10
typedef int datatype;
typedef struct{
	datatype data[MAXSIZE];
	int len;
}Sqlist;

Sqlist *create_list();

int insert_rear(datatype element,Sqlist *list);
	
void output_sqlist(Sqlist *list);

int delete_rear(Sqlist *list);

int insert_sub(Sqlist *list, datatype element, int sub);

int delete_sub(Sqlist *list, int sub);

int change_sub(Sqlist *list, datatype element, int sub);

int find_sub(Sqlist *list, int sub);

int find_element(Sqlist *list, datatype element);

int delete_element(Sqlist *list, datatype element);

int change_element(Sqlist *list,datatype element,datatype changed );

void remove_duplicates(Sqlist *list);

void bubble_sort(Sqlist *list);

void selection_sort(Sqlist *list);

Sqlist *free_fun(Sqlist *list);

#endif

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	
	Sqlist *list =create_list();
	int n;
	datatype element;
	printf("please inter n:");
	scanf("%d", &n);

	for(int i=0; i<n; i++)
	{
		printf("please input %d element:", i+1);
		scanf("%d", &element);
		//把element插入到顺序表尾部
		insert_rear(element,list);
	}
	
	output_sqlist(list);
	
	//尾部删除
	delete_rear(list);
	output_sqlist(list);
	
	//按照下标插入
	int sub;
	printf("please enter insert element:");
	scanf("%d", &element);
	printf("plsase enter insert sub:");
	scanf("%d", &sub);
	insert_sub(list,element,sub);
	output_sqlist(list);
/*
	//按下标删除
	printf("pleasr enter delete sub:");
	scanf("%d", &sub);
	delete_sub(list,sub);
	output_sqlist(list);

	//按下标修改
	printf("please enter change element:");
	scanf("%d", &element);
	printf("please enter change sub:");
	scanf("%d", &sub);
	change_sub(list,element,sub);
	output_sqlist(list);

	//按下标查找
	printf("please enter find sub:");
	scanf("%d", &sub);
	find_sub(list, sub);
	printf("list->data[%d]=%d\n", sub,list->data[sub]);
*/
	//按元素查找
	printf("please enter find element:");                 
	scanf("%d", &element);                                
	find_element(list, element);
	//printf("element %d is at index %d\n", element, x);


	//按元素删除
	printf("pelease enter delete element:");
	scanf("%d", &element);
	delete_element(list,element);
	output_sqlist(list);
	
	//按元素修改
	printf("please enter change element:");
	scanf("%d", &element);
	printf("please enter element to be changed:");
	scanf("%d", &sub); //该处的sub参数不是下标,是被修改的元素值
	change_element(list, element, sub);
	output_sqlist(list);

	//顺序表去重
	remove_duplicates(list);
	printf("After removing duplicates:\n");
	output_sqlist(list);


	//顺序表冒泡排序
	bubble_sort(list);
	printf("After bubble_sort:");
	output_sqlist(list);

	//顺序表选择排序
	selection_sort(list);
	printf("After selection_sort:");
	output_sqlist(list);

	//释放
	list = free_fun(list);
	
	return SUCCESS;
}

test.c

    

#include "head.h"

Sqlist *create_list()
{
//创建顺序表
	Sqlist *list =(Sqlist *) malloc(sizeof(Sqlist));
	if(NULL==list)
	{
		printf("Sqlist create false");
		return NULL;
	}
	//对数据元素清0
	memset(list->data,0,sizeof(list->data));

	//对顺序表长度清0
	list->len = 0;

	return list;
}

int insert_rear(datatype element,Sqlist *list)
{
	//1.判断顺序表是否创建
	//2.判断顺序表是否已满
	if(list==NULL || list->len == MAXSIZE)
	{
		printf("insert_rear error\n");
		return FALSE;
	}

	//3.在尾部插入
	list->data[list->len]=element;
	list->len++;
	return SUCCESS;
}

//循环输出
void output_sqlist(Sqlist *list)
{
	//1.顺序表创建失败
	//2.顺序表为空
	if(list == NULL || list->len == 0)
	{
		printf("optput error\n");
		return;
	}

	for(int i=0; i<list->len; i++)
	{
		printf("%d ", list->data[i]);
	}

	printf("\n");
}


int delete_rear(Sqlist *list)
{
	//1.判断顺序表是否创建
	//2.判断顺序表是否为空
	if(list ==NULL || list->len == 0)
	{
		printf("delete error\n");
		return FALSE;
	}

	list->data[list->len-1] = 0;
	list->len--;
	
	return SUCCESS;

}

int insert_sub(Sqlist *list, datatype element, int sub)
{
	//判断顺序表是否创建 
	//判断顺序表是否已满 
	//判断下标是否合法
	if(list == NULL || list->len==MAXSIZE || sub<0 || sub>list->len)
	{
		printf("insert_sub error\n");
		return FALSE;
	}

	//循环后移
	for(int i=list->len-1; i>=sub; i--)
	{
		list->data[i+1] = list->data[i];
	}

	//在下标为sub的位置插入
	list->data[sub] = element;
	list->len++;
	return SUCCESS;
}

int delete_sub(Sqlist *list, int sub)
{
	//判断顺序表是否创建
	//判断顺序表是否为空
	//判断下标是否合法
	if(list == NULL || list->len==0 || sub<0 || sub>list->len)
	{
		printf("delete_sub error\n");
		return FALSE;
	}

	//循环前移
	for(int i=sub+1; i<list->len; i++)
	{
		list->data[i-1] = list->data[i];
	}
	list->len--;
	return SUCCESS;
}

int change_sub(Sqlist *list, datatype element, int sub)
{
	//判断顺序表是否创建
	//判断顺序表是否为空
	//判断下标是否合法
	if(list == NULL || list->len == 0 || sub<0 || sub>=list->len)
	{
		printf("change_sub error\n");
		return FALSE;
	}

	list->data[sub] = element;
	return SUCCESS;
}



int find_sub(Sqlist *list, int sub)
{
    //判断顺序表是否创建
    //判断顺序表是否为空
    //判断下标是否合法

    if(list == NULL || list->len == 0 || sub<0 || sub>=list->len)
    {
        printf("find_sub error\n");
        return FALSE;
    }
	
    return SUCCESS;
}


int find_element(Sqlist *list, datatype element)
{
	   //判断顺序表是否创建
	   //判断顺序表是否为空
	   if(list == NULL || list->len==0)
	   {
	   printf("find_element error\n");
	   return FALSE;
	   }

	   //循环顺序表的元素,如果元素存在则返回下标sub,否则返回-1
		for(int i=0; i<list->len; i++)
		{
			if(list->data[i] == element)
			{
				printf("element %d found at index %d\n", element, i);
				return i;
			}
		}
		printf("element %d don't exit\n", element);
		return FALSE;
}

int delete_element(Sqlist *list, datatype element)
{
	//调用按元素查找的函数
	int sub = find_element(list, element);
	if(sub == FALSE)
	{
		printf("delete_element error:element don't exit\n");
		return FALSE;
	}

	

	//调用按下标删除元素的函数
	return delete_sub(list, sub);

}

int change_element(Sqlist *list,datatype element,datatype changed )
{
	//调用按元素查找的函数 
	int sub = find_element(list, changed);
	if(sub == -1)
	{
	//	printf("change_element error: element %d don't exit\n", changed);
		return FALSE;
	}


	//调用按下标修改元素的函数
	return change_sub(list, element, sub);


}

//去重函数
void remove_duplicates(Sqlist *list)
{
	//判断顺序表是否创建
	//判断顺序表是否为空
	if(list ==NULL || list->len == 0)
	{
		printf("remove_duplicates error\n");
		return;
	}
	
	//去重
	for(int i=0; i<list->len; i++)
	{
		for(int j=i+1; j<list->len; j++)
		{
			if(list->data[i] == list->data[j])
			{
				delete_sub(list,j);
				j--;
			}
		}
	}
}


void bubble_sort(Sqlist *list)
{
	//判断顺序表是否创建
	//判断顺序表中的元素数量是否小于1
	if(list == NULL || list->len <=1)
	{
		printf("bubble_sort error\n");
		return ;
	}

	//冒泡排序
	for(int i=0; i<list->len; i++)
	{
		for(int j=0; j<list->len-i-1; j++)
		{
			if(list->data[j]>list->data[j+1])
			{
				datatype temp = list->data[j];
				list->data[j] = list->data[j+1];
				list->data[j+1] = temp;
			}
		}
	}
}


void selection_sort(Sqlist *list)
{
	if(list == NULL || list->len <= 1)
	{
		printf("selection_sort error\n");
		return;
	}

	//选择排序
	for(int i=0; i<list->len-1; i++)
	{
		datatype min = i;
		for(int j=i+1; j<list->len; j++)
		{
			if(list->data[min]<list->data[j])
					min = j;
		}
	
		if(min != i)
		{
			datatype temp = list->data[min];
			list->data[min] = list->data[i];
			list->data[i] = temp;
		}
	}
}
		
Sqlist *free_fun(Sqlist *list)
{
	if(list == NULL)
		return NULL;

	free(list);
	list = NULL;
	return list;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值