(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);
}