大二开始学习数据结构了 用的是严蔚敏的教材 写点东西做一下巩固和总结,第一次写博客 有人看的话如果发现问题希望能提出来*(´;ω;`)
在学习中代码参考自这里
要实现的功能
创建和初始化插入和删除元素顺序表的遍历表是否为空/满求某位置元素的前驱和后继取某位置的值线性表的清空和销毁求两个线性表的交集和并级 代码大部分按照自己的想法写的 可能会有不是很好的地方或者不完善的地方 。。。。QAQ == 我是用VS2019写的代码 好几把烦每次都会敲出各种小错误耽误大量时间MLGB
#include <iostream>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREASE 10
using namespace std
;
typedef struct
{
int *data
;
int length
;
int listsize
;
}SeqList
;
int InitList(SeqList
* L
);
int InsertList(SeqList
* L
, int i
, int e
);
int ListDelete(SeqList
* L
, int i
);
void TraverseList(SeqList
* L
);
bool ListEmpty(SeqList
* List
);
bool ListFull(SeqList
* List
);
int PriorElem(SeqList
* List
, int i
);
int NextElem(SeqList
* List
, int i
);
int GetElme(SeqList
* List
, int i
);
void ClearList(SeqList
* List
);
void DestroyList(SeqList
* List
);
void Union(SeqList
*L1
, SeqList L2
);
void Merge(SeqList
*L1
, SeqList L2
);
int LocateElem(SeqList L
, int e
, int Compare(int, int));
int Equal(int a
, int b
);
int main()
{
cout
<<"数据结构好难"<<endl
;
int e
;
SeqList List
,List2
,List3
;
InitList(&List
);
InitList(&List2
);
InitList(&List3
);
InsertList(&List
, 1, 1);
InsertList(&List
, 2, 2);
InsertList(&List
, 3, 3);
InsertList(&List
, 4, 4);
InsertList(&List
, 5, 5);
InsertList(&List
, 6, 6);
InsertList(&List2
, 1, 4);
InsertList(&List2
, 2, 5);
InsertList(&List2
, 3, 6);
InsertList(&List2
, 4, 7);
InsertList(&List2
, 5, 8);
InsertList(&List2
, 6, 9);
cout
<< "List1:" << endl
;
TraverseList(&List
);
cout
<< "List2:" << endl
;
TraverseList(&List2
);
cout
<< "List1 ∩ List2:" << endl
;
Merge(&List
, List2
);
TraverseList(&List
);
return 0;
}
int InitList(SeqList
* L
)
{
L
->data
= (int*)malloc(LIST_INIT_SIZE
* sizeof(SeqList
));
if (!(L
->data
))
{
cout
<< "内存非配失败" << endl
;
exit(1);
}
else
{
L
->length
= 0;
L
->listsize
= LIST_INIT_SIZE
;
}
return 1;
}
int InsertList(SeqList
* L
, int i
, int e
)
{
if (i
> L
->listsize
+ 1 || i
< 1)
return 0;
int* newbase
;
int* p
, * q
;
if (L
->length
>= L
->listsize
)
{
newbase
= (int*)realloc(L
->data
, sizeof(SeqList
) * (L
->listsize
+ LISTINCREASE
));
if (!newbase
)
{
cout
<< "内存分派失败" << endl
;
exit(1);
}
L
->listsize
+= LISTINCREASE
;
L
->data
= newbase
;
}
q
= &L
->data
[i
- 1];
for (p
= &L
->data
[L
->length
- 1]; p
>= q
; --p
)
* q
= *(q
+ 1);
*q
= e
;
L
->length
++;
return 1;
}
int ListDelete(SeqList
* L
, int i
)
{
if (i
<1 || i
>L
->length
)
return 0;
int* p
, * q
;
q
= &L
->data
[i
- 1];
p
= &L
->data
[L
->length
- 1];
for (++q
; q
<= p
; ++q
)
* (q
- 1) = *q
;
L
->length
--;
return 1;
}
void TraverseList(SeqList
* L
)
{
for (int i
= 0; i
< L
->length
; i
++)
cout
<< L
->data
[i
] << " ";
cout
<< endl
;
}
bool ListEmpty(SeqList
* List
)
{
if (List
->length
== List
->listsize
)
return true;
else
return false;
}
bool ListFull(SeqList
* List
)
{
if (List
->length
== 0)
return true;
else
return false;
}
int PriorElem(SeqList
* List
, int i
)
{
if (i
<1 || i
>List
->length
)
{
cout
<< "元素位置输入不合法" << endl
;
return 0;
}
if (i
== 1)
{
cout
<< "无前驱" << endl
;
return 0;
}
return List
->data
[i
- 2];
}
int NextElem(SeqList
* List
, int i
)
{
if (i
<1 || i
>List
->listsize
)
{
cout
<< "元素位置输入不合法" << endl
;
exit(-1);
}
if (i
== List
->length
)
{
cout
<< "无后继" << endl
;
exit(-1);
}
return List
->data
[i
];
}
int GetElme(SeqList
* List
, int i
)
{
return List
->data
[i
- 1];
}
void ClearList(SeqList
* List
)
{
List
->length
= 0;
cout
<< "已清空" << endl
;
}
void DestroyList(SeqList
* List
)
{
free(List
->data
);
List
->data
= NULL;
List
->listsize
== 0;
List
->length
= 0;
cout
<< "已销毁" << endl
;
}
void Union(SeqList
*L1
, SeqList L2
)
{
int L1_length
= L1
->length
;
int L2_length
= L2
.length
;
int e
;
for (int i
= 1; i
<= L2
.length
; i
++)
{
e
= GetElme(&L2
, i
);
if (!LocateElem(*L1
, e
, Equal
))
InsertList(L1
, L1
->length
+1, e
);
}
}
void Merge(SeqList
*L1
, SeqList L2
)
{
int L1_length
= L1
->length
;
int L2_length
= L2
.length
;
int e
;
for (L1_length
; L1_length
>= 1; L1_length
--)
{
e
= GetElme(L1
, L1_length
);
if (!LocateElem(L2
, e
, Equal
))
ListDelete(L1
, L1_length
);
}
}
int LocateElem(SeqList L
, int e
, int(Compare
)(int, int))
{
int i
= 1;
while (i
<= L
.length
&& !Compare(e
, L
.data
[i
- 1]))
i
++;
if (i
<= L
.length
)
return i
;
else
return 0;
}
int Equal(int a
, int b
)
{
if (a
== b
)
return 1;
else
return 0;
}
初始化首先要给结构体里的指针分配内存空间,然后初始化顺序表可以储存的数据数量和已存在的数据数量 ↩︎
插入和删除时要注意元素的位置不要超出初始化时的范围,如果顺序表满了要用realloc函数扩充 ↩︎
表长=0为空 表长=listsize为满 ↩︎
将第二个表中的元素和第一个表中的元素进行对比 求并集时把B中存在且不与A集合中元素重合的元素放进A中 实现对比需要创建 LocateElem(SeqList L,int e,int Compare(int ,int)) 函数把表中元素和要插入的元素按照Compare规则进行对比 ↩︎