数据结构-顺序表(C语言实现)

主函数代码(main.c)

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "sqlist.h"
int main()
{
	sqlist *list= NULL,*list_next= NULL;
	int pos = 0;
	int i, err, value;
	int arr[10] = { 10,20,30,40,50,60,70,80,90,100 };
	int arr_next[10] = { 11,22,33,44,55,66,77,88,99,111 };
	//创建一个顺表list,并初始化
	list = create_sqlist();
	if (list == NULL)
	{
		fprintf(stderr, "create_sqlist()failed\n");
	}
	for (i = 0; i < 10; i++)
	{
		add_sqlist(list, &i);
	}
	for (i = 0; i < sizeof(arr) / sizeof(*arr); i++)
	{
		if ((err = insert_sqlist(list, 2, &arr[i]))!=0)
		{
			if (err = -1)
			{
				fprintf(stderr, "The arr is full\n");
			}
			else if (err = -2)
			{
				fprintf(stderr, "The pos you want to insert is wrong\n");

			}
			else
			{
				fprintf(stderr, "ERROR\n");
			}
		}
	}
	
	display_sqlist(list);


	/*根据下标删除元素部分测试代码,pos==0跳出循环*/
	/*do {
		printf("请输入您要删除的元素下标从1开始\n");
		scanf("%d", &pos);
		err = delete_sqlist(list, pos);
		display_sqlist(list);
	} while (pos);*/


	/*给出下标查找元素部分测试代码,pos==2000退出循环*/
	//while (1)
	//{
	//	scanf("%d", &pos);
	//	find_sqlsit(list, pos);
	//	if (pos == 2000)
	//	{
	//		break;
	//	}
	//}


	/*给出元素查找下标部分测试代码,查找失败退出循环*/
	/*while (1)
	{
		printf("请输入您要查找的元素\n");
		scanf("%d", &value);
		pos=find1_sqlist(list, &value);
		if (pos == 0)
		{
			printf("查找失败,顺序表中没有该元素\n");
			break;
		}
		else if (pos == -1)
		{
			printf("查找失败, 顺序表为空\n");
		}
		else {
			printf("%d的下标时%d\n", value, pos);
		}
	}*/
	//创建一个顺表list_next,并初始化
	list_next = create_sqlist();
	if (list_next == NULL)
	{
		fprintf(stderr, "create_sqlist()failed\n");
	}
	for (i = 0; i < 10; i++)
	{
		add_sqlist(list_next, &i);
	}
	for (i = 0; i < sizeof(arr_next) / sizeof(*arr_next); i++)
	{
		if ((err = insert_sqlist(list_next, 2, &arr_next[i])) != 0)
		{
			if (err = -1)
			{
				fprintf(stderr, "The arr is full\n");
			}
			else if (err = -2)
			{
				fprintf(stderr, "The pos you want to insert is wrong\n");

			}
			else
			{
				fprintf(stderr, "ERROR\n");
			}
		}
	}
	display_sqlist(list_next);
	union_sqlist(list, list_next);
	display_sqlist(list);

	destroy_sqlist(list_next);
	destroy_sqlist(list);

}

sqlist.h文件代码(负责函数声明)

#ifndef SQLIST_H__
#define SQLIST_H_
#define MAX_LENGTH 1024
typedef int datatype;

typedef struct sqlist
{
	datatype data[MAX_LENGTH];
	int size;
}sqlist;
sqlist* create_sqlist(void);
void create_sqlist1(sqlist *ps);//创建顺序表
void display_sqlist(sqlist *ps);//打印顺序表
int add_sqlist(sqlist *ps,datatype *num);//顺序表结尾添加元素
int delete_sqlist(sqlist *ps,int pos);//删除顺序表pos处的元素
int insert_sqlist(sqlist *ps,int pos,datatype *num);//顺序表pos处插入元素
void destroy_sqlist(sqlist *ps);//销毁顺序表
int find_sqlsit(sqlist *ps,int pos);//给出下标找元素
int find1_sqlist(sqlist *ps, datatype* value);//给出元素查下标
int setempty_sqlist(sqlist* ps);//顺序表置为空
int union_sqlist(sqlist* list1, sqlist* list2);//顺序表的合并
#endif

sqlist.c文件代码(负责函数定义)

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include "sqlist.h"
sqlist* create_sqlist(void)
{
	sqlist *ps;
	ps=(sqlist*)malloc(sizeof(sqlist));
	if (ps == NULL)
	{
		return NULL;
	}
	else
	{
		ps->size = 0;
		return ps;
	}
}


void create_sqlist1(sqlist *ps)
{
	
	ps = malloc(sizeof(sqlist));
	if (ps == NULL)
	{
		return;
	}
	else
	{
		ps->size = 0;
		return;
	}
}


void display_sqlist(sqlist *ps)
{
	if (ps->size == 0)
	{
		printf("数组为空\n");
		return ;
	}
	int i = 0;
	printf("数组中元素个数为%d\n", ps->size);
	printf("数组中的元素依次为:\n");
	for (i = 0; i < ps->size; i++)
	{
		printf("%d : %d\n", i + 1, ps->data[i]);
	}
}
int  add_sqlist(sqlist *ps,datatype *num)
{
	ps->data[ps->size] = *num;
	ps->size++;
	//printf("元素添加成功\n");
	return 0;

}


int insert_sqlist(sqlist *ps, int pos, datatype *num)
{
	int j = 0;
	if (ps->size == MAX_LENGTH)
	{
		return -1;
	}
	if (pos < 0 || pos > ps->size)
	{
		return -2;
	}
	
	for (j = ps->size;j > pos;j--)

	{
		ps->data[j] = ps->data[j-1];
	}
	ps->data[pos] = *num;
	ps->size++;
	/*printf("元素插入成功\n");*/
	return 0;


}

int  delete_sqlist(sqlist *ps, int pos)
{
	int i = 0;
	pos = pos - 1;
	if (ps->size == 0)
	{
		printf("删除失败, 顺序表为空\n");
		return -1;
	}
	if (pos<0 || pos>=ps->size)
	{
		printf("删除失败,pos处没有元素\n");
		return -2;
	}
	for (i = pos; i < ps->size-1; i++)
	{
		ps->data[i] = ps->data[i + 1];
	}
	ps->size--;
	printf("pos处的元素删除成功\n");
	return 0;
}


//给出下标找元素
int find_sqlsit(sqlist *ps,int pos)
{

	if (ps->size == 0)
	{
		printf("查找失败, 顺序表为空\n");
		return -1;
	}
	if (pos <= 0 || pos > ps->size)
	{
		printf("查找失败,pos处没有元素\n");
		return -2;
	}
	printf("顺序表中第%d个元素为%d",pos, ps->data[pos -1]);
	printf("查找成功\n");
	return 0;
}

//给出元素查下标
int find1_sqlist(sqlist *ps, datatype* value)
{
	
	int i = 0;
	
	if (ps->size == 0)
	{
		
		return -1;
	}
	for (i = 0; i < ps->size; i++)
	{
		if (ps->data[i] == *value)
		{
			return i + 1;
		}
	}
	return 0;
}

int setempty_sqlist(sqlist* ps)
{
	ps->size = 0;
	return 0;
}

int union_sqlist(sqlist* list1, sqlist* list2)//顺序表的合并
{
	int i = 0;
	//list1后面追加list2中与list1中不同的元素
	//list1 12 34 56 78 90
	//list2 23 90 45 67 78 
	//合并后的结果list1 12 34 56 78 90 23 45 67 
	//思路:先查找在插入
	//查找:list1中是否有list2中第i个元素,若有则不插入,若无则插入
	if (list2 == NULL&&list1 !=NULL) 
	{
		printf("list1与list2合并成功\n");
		return 0;
	}
	if (list1 == NULL)
	{
		printf("list1与list2合并失败\n");
		return -1;
	}
	for (i = 0; i < list2->size; i++)
	{
		if ((find1_sqlist(list1, &list2->data[i])) <= 0)
		{
			insert_sqlist(list1, list1->size, &list2->data[i]);
		}
	}
	printf("list1与list2合并成功\n");
	return 0;
}

void destroy_sqlist(sqlist *ps)
{
	free(ps);
	ps = NULL;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值