#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define LISTINCREMENT 10
#define Status int
#define _OVERFLOW -1
typedef struct {
int* data;
int maxsize;
int length;
}Sqlist;
Status InitList(Sqlist& L)
{
L.data = (int*)malloc(sizeof(int) * MaxSize);
if (L.data == NULL) return 0;
L.maxsize = MaxSize;
L.length = 0;
return 1;
}
Status DestroyList(Sqlist& L)
{
delete(L.data);
L.data = NULL;
L.maxsize = L.length = 0;
return 1;
}
void ClearList(Sqlist& L)
{
L.length = 0;
}
Status ListEmpty(Sqlist& L)
{
return L.length == 0;
}
Status ListLength(Sqlist& L)
{
return L.length;
}
Status GetElem(Sqlist& L, int i, int& e)
{
if (i<1 || i>L.length)
return 0;
e = L.data[i - 1];
return 1;
}
int LocateElem(Sqlist& L, int e, Status(*compare)(int, int))
{
int i = 1;
int* p = L.data;
while (i <= L.length && !compare(*(p++), e))
++i;
if (i <= L.length)
return i;
return 0;
}
int PriorElem(Sqlist& L, int cur_e, int& pr_e)
{
int i = 2;
int* p = L.data + 1;
while (i <= L.length && *(p++) != cur_e)
i++;
if (i > L.length)
return -1;
pr_e = *(--p);
return 1;
}
int NextElem(Sqlist& L, int cur_e, int& net_e)
{
int i = 1;
int* p = L.data;
while (i < L.length && cur_e != *(p++))
i++;
if (i == L.length)
return -1;
net_e = *(++p);
return 1;
}
Status ListInsert(Sqlist& L, int i, int e)
{
if (i<1 || i>L.length + 1)
return 0;
if (L.length >= L.maxsize)
{
int* newbase = (int*)realloc(L.data, (L.maxsize + LISTINCREMENT) * sizeof(int));
if (newbase == NULL)
exit(_OVERFLOW);
L.data = newbase;
L.maxsize += LISTINCREMENT;
}
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return 1;
}
bool ListDelete(Sqlist& L, int i, int& e)
{
if (i<1 || i>L.length)
return 0;
e = L.data[i - 1];
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j];
}
L.length--;
return 1;
}
void ListExchange(Sqlist& a, Sqlist& b)
{
Sqlist tem = a;
a = b;
b = tem;
}
//例 2-1 线性表的集合操作
Status equal(int a, int b)
{
if (a == b)
return 1;
return 0;
}
Status greate(int a, int b)
{
if (a > b)
return 1;
return 0;
}
Status small(int a, int b)
{
if (a < b)
return 1;
return 0;
}
//并集
void List_union(Sqlist& a, Sqlist b)
{
int la_len = ListLength(a);
int lb_len = ListLength(b);
int e;
for (int i = 1; i <= lb_len; i++)
{
GetElem(b, i, e);
if (!LocateElem(a, e, equal))
{
ListInsert(a, ++la_len, e);
}
}
}
//交集
void List_Intersection(Sqlist& a, Sqlist b)
{
int la_len = ListLength(a);
int lb_len = ListLength(b);
int e;
if (la_len > lb_len)
ListExchange(a, b);
for (int i = 1; i <= la_len; i++)
{
GetElem(a, i, e);
if (!LocateElem(b, e, equal))
{
ListDelete(a, i, e);
}
}
}
//差集
void List_Difference(Sqlist& a, Sqlist b)
{
int la_len = ListLength(a);
int lb_len = ListLength(b);
int e;
for (int i = 1; i <= lb_len; i++)
{
GetElem(b, i, e);
int pos = LocateElem(a, e, equal);
if (pos != 0)
{
ListDelete(a, pos, e);
}
}
}
//算法 2.1
void MergeList(Sqlist a, Sqlist b, Sqlist& c)
{
InitList(c);
int i = 1, j = 1, k = 0, ai, bj;
int la_len = ListLength(a);
int lb_len = ListLength(b);
while (i <= la_len && j <= lb_len)
{
GetElem(a, i, ai);
GetElem(b, j, bj);
if (ai >= bj) {
ListInsert(c, ++k, ai); ++i;
}
else {
ListInsert(c, ++k, bj); ++j;
}
}
while (i <= la_len) {
GetElem(a, i++, ai);
ListInsert(c, ++k, ai);
}
while (j <= lb_len) {
GetElem(b, j++, bj);
ListInsert(c, ++k, bj);
}
}
Status ListDelete_sq(Sqlist& L, int i, int& e)
{
if (i<1 || i>L.length)
return 0;
int* p = &(L.data[i - 1]);
e = *p;
int* q = L.data + L.length - 1;
for (++p; p <= q; ++p)
*(p - 1) = *p;
--L.length;
return 1;
}
int main()
{
Sqlist L;
return 0;
}
【数据结构/C语言版】【线性表】
最新推荐文章于 2024-04-24 22:36:59 发布