sqlist.h
#pragma once
//条件编译的功能是防止头文件重复包含,如果不包含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_creat();
void sqlist_creat1(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*);
void sqlist_display(sqlist*);
int sqlist_destroy(sqlist*);
int sqlist_union(sqlist*, sqlist*);
#endif
sqlist.c
#include <stdlib.h>
#include <stdio.h>
#include "sqlist.h"
sqlist* sqlist_creat()
{
sqlist* me = NULL;
me = (sqlist*)malloc(sizeof(*me));
if (me == NULL)
{
return NULL;
}
me->last = -1;
return me;
}
void sqlist_creat1(sqlist** sq)
{
}
int sqlist_insert(sqlist* me, int i, datatype* data)
{
if (me->last == DATASIZE - 1)
return -1;
if (i <0 || i > me->last + 1)
return -2;
//移动
for (int j = me->last; j >= i; j--)
{
me->data[j + 1] = me->data[j];
}
me->data[i] = *data;
me->last++;
return 0;
}
//参数顺序表和需要删除元素的下标
int sqlist_delete(sqlist* me, int i)
{
int temp;
//顺序表位空
if (sqlist_isempty(me) == 0)
{
fprintf(stderr, "顺序表为空!\n");
return -1;
}
//下标i不合法
if (i <0 || i >me->last)
{
fprintf(stderr, "下标不合法!\n");
return -2;
}
//对元素进行删除
for (int j = i; j < me->last; j++)
{
temp = me->data[i];
me->data[j] = me->data[j + 1];
}
me->last--;
return 0;
}
//找到返回下标,若没有找到返回-1
int sqlist_find(sqlist* me, datatype* data)
{
if (sqlist_isempty(me) == 0)
{
return -1;
}
for (int 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);
}
void sqlist_display(sqlist* me)
{
if (me->last == -1)
return;
for (int i = 0; i <= me->last; i++)
{
printf("%d ", me->data[i]);
}
printf("\n");
return;
}
int sqlist_destroy(sqlist* me)
{
free(me);
return 0;
}
//把sq1合并到sq2上
int sqlist_union(sqlist* sq1, sqlist* sq2)
{
int i = 0;
for (i = 0; i <= sq1->last; i++)
{
if (sqlist_find(sq2, &(sq1->data[i])) < 0)
{
sqlist_insert(sq2, sq2->last + 1, &(sq1->data[i]));
}
}
return 0;
}
main.c
#include <stdlib.h>
#include <stdio.h>
#include "sqlist.h"
int main()
{
sqlist* sq = sqlist_creat();
sqlist* sq2 = sqlist_creat();
datatype arr[] = { 11,22,33,44,55 };
datatype arr2[] = { 11,44,66,77,88 };
int err,err2;
if (sq == NULL || sq2 == NULL)
{
fprintf(stderr, "sqlist_creat() failed!\n");
exit(1);
}
for (int i = 0; i < sizeof(arr) / sizeof(*arr); i++)
{
if ((err = sqlist_insert(sq, 0, &arr[i])) != 0 || (err2 = sqlist_insert(sq2, 0, &arr2[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(sq);
sqlist_delete(sq, 1);
sqlist_display(sq);
sqlist_union(sq, sq2);
sqlist_display(sq2);
sqlist_destroy(sq);
exit(0);
}