顺序存储线性表:增删改查....

(1) sqlist.h文件

#ifndef SQLIST_H__
#define SQLIST_H__
#define DATASIZE 1024// 数组有多大
typedef int datatype;
typedef struct node_st//结构体
{
	datatype data[DATASIZE];//定义当前数组的大小
	int last;//计数器:当前存放元素的下标值
}sqlist;

sqlist *sqlist_create();//创建表
void sqlist_create1(sqlist **);//传一个二级指针

int sqlist_insert(sqlist *,int i,datatype *);//插入元素:往那个链表插入,指定位置,插入什么数据

int sqlist_delete(sqlist *,int i);//删除元素:从哪个链表中,删除哪个位置

int sqlist_find(sqlist * ,datatype *);//查找元素:从哪个链表,查找内容值

int sqlist_isempty(sqlist *);//判断列表是否为空

int sqlist_setempty(sqlist *);//强制设置列表为空

int sqlist_getnum(sqlist *);//获取链表的元素

int sqlist_union(sqlist * ,sqlist *);//合并两个表

void sqlist_display(sqlist *);

int sqlist_destroy(sqlist *);//摧毁列表
#endif

(2)sqlist.c文件

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

sqlist *sqlist_create()//创建表
{
	sqlist *me;//定义一个指针me
	me = malloc(sizeof(*me));//malloc()给me指针分配内存空间
	if (me == NULL)//如果分配失败
		return NULL;//返回空
	me->last = -1;//成功后,把me的last成员初始化为-1
	return me;
}
void sqlist_create1(sqlist **ptr)//**ptr可以在函数内部改变指针本身
{
	*ptr = malloc(sizeof(**ptr));//给**ptr用malloc()分配内存空间,再用*ptr作为接受
	if(*ptr == NULL)
		return ;
	(*ptr)->last = -1;
	return ;
}
int sqlist_insert(sqlist *me,int i,datatype *data)//插入元素
{
	int j ;//定义一个j作为位置移动标志
	if(me->last == DATASIZE-1)//如果me->last超于最大值
		return -1;//返回-1
	if(i < 0 || i > me->last+1)//如果 i的位置小于零,i的位置大于me->last+1
		return -2;//返回-2
	for(j = me->last;i <= j;j--)//j作为记录当前me->last的位置,i小于j,j的位置向后移
		me->data[j+1] = me->data[j];//把j的位置移到j+1
	me->data[i] = *data;//把*data值传给i
	me->last++;//me->last依次移动
	return 0;
	
}

int sqlist_delete(sqlist *me,int i)//删除元素
{
	int j;
	if(i < 0 || i > me->last)
		return -1;
	for(j = i+1; j <= me->last;j++ )
		me->data[j-1] = me->data[j];
	me->last--;
	return 0;
}
int sqlist_find(sqlist *me ,datatype *data)//查找元素
{
	int i;
	if(sqlist_isempty(me) == 0)
		return -1;
	for(i = 0;i < me->last;i++)
		if(me->data[i] == *data)
			return i;
	return -1;
}
int sqlist_isempty(sqlist *me)//判断列表是否为空
{
	if(me->last == -1)
		return 0;
	return -1;
}
int sqlist_setempty(sqlist *me)//强制设置列表为空
{
	me->last = -1;
	return 0;
}
int sqlist_getnum(sqlist *me)//获取列表的长度
{
	return	(me->last+1);
}
int sqlist_union(sqlist * list1,sqlist *list2)//合并两个表
{
	int i = 0;
	for(i = 0;i <= list2->last;i++ )
	{
		if(sqlist_find(list1,&list2->data[i]) < 0)
		{
			sqlist_insert(list1,0,&list2->data[i]);
		}
	}

}
void sqlist_display(sqlist *me)
{
	int i;
	if (me->last == -1)//判断me是否为空
		return ;
	for(i = 0;i <= me->last;i++)//如果不为空,遍历i值
		printf("%d ",me->data[i]);
	printf("\n");
	return ;
}
int sqlist_destroy(sqlist *me)//摧毁列表
{
	free(me);
	return 0;
}

(3)main.c

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

#include"sqlist.h"

int main()
{
	sqlist *list = NULL,*list1 = NULL;
	datatype arr[] = {12,23,34,45,56};
	datatype arr1[] = {89,90,13,14,51};
	int i,err;
	
	list = sqlist_create();
	//sqlist_create1(&list);
	if (list == NULL)
	{
		fprintf(stderr,"sqlist_create() failed!\n");
		exit(1);
	}
	
		list1 =sqlist_create();
	if (list1 == NULL)
	{
		fprintf(stderr,"sqlist_create() failed!\n");
		exit(1);
	}	
	
	for(i = 0;i < sizeof(arr)/sizeof(*arr);i++)
	{
		if((err = sqlist_insert(list,0,&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");
			exit(1);
		}
	}

	

	//sqlist_delete(list,1);
	for(i = 0;i < sizeof(arr1)/sizeof(*arr1);i++)
	{
		if((err = sqlist_insert(list1,0,&arr1[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");
			exit(1);
		}
	}
	sqlist_display(list);
	sqlist_display(list1);

	sqlist_union(list,list1);
	sqlist_display(list);
	sqlist_destroy(list);
	sqlist_destroy(list1);
	exit(0);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值