题目: 假设利用两个线性表 LA 和 LB,分别表示两个集合A 和 B,现要求新的集合A = A ∪ B
核心代码段:
void ListUnion (SeqList * LA, SeqList * LB)
{
int La_len = 0;
int Lb_len = 0;
int i = 0;
ElemType val = 0;
La_len = ListLength (LA);
Lb_len = ListLength (LB);
for (i = 1; i <= Lb_len; i++)
{
// 获取LB链表中的每一个值
val = GetElem (LB, i);
// 判断这个值是否存在于LA中,若不存在,添加进去
if (LocateElem (LA, val, Compare) == 0)
{
ListInsert (LA, ++La_len, val);
}
}
}
.h文件
# ifndef SEQLIST_H_
# define SEQLIST_H_
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 2
typedef int ElemType;
// 定义结构体
typedef struct SeqList_tag
{
ElemType * elem; //链表的起始地址
int length; //链表的长度
int size; //链表现有的长度
}SeqList;
// 1 初始化一个线性表
int InitList (SeqList * L);
// 2 销毁线性表
int Destory (SeqList * L);
// 3 清空线性表
int Clear (SeqList * L);
// 4 判断链表是否为空
int ListEmpty (SeqList * L);
// 5 返回链表的长度
int ListLength (SeqList * L);
// 6 在L中的第i个位置前插入新的元素e
int ListInsert (SeqList * L, int pos, int val);
// 7 获取L中的第i个位置的元素
ElemType GetElem (SeqList * L, int pos);
ElemType ListDelete (SeqList * L, int pos);
int LocateElem (SeqList * L, ElemType val, int (Compare)(ElemType, ElemType));
int Compare(ElemType, ElemType);
void ListUnion (SeqList * LA, SeqList * LB);
#endif
.c文件
# include "SeqList.h"
#include <malloc.h>
/*
typedef struct SeqList_tag
{
ElemType * elem; //链表的起始地址
int length; //链表的长度
int size; //链表现有的长度
}SeqList;
*/
// 1 初始化一个线性表
int InitList (SeqList * L)
{
// 1.1 分配一块内存
L->elem = (SeqList *) malloc (LIST_INIT_SIZE * sizeof (ElemType));
if (L->elem == NULL)
{
return -1;
}
L->length = 0;
L->size = LIST_INIT_SIZE;
return 0;
}
int Destory (SeqList * L)
{
if (L->elem != NULL)
{
free (L->elem);
L->elem = NULL;
L->length = 0;
L->size = 0;
return 0;
}
return -1;
}
int Clear (SeqList * L)
{
L->length = 0;
return L->length;
}
// 4 判断链表是否为空
int ListEmpty (SeqList * L)
{
if (L->length != 0)
return 0;
else
return -1;
}
// 5 返回链表的长度
int ListLength (SeqList * L)
{
return L->length;
}
// 6 在L中的第i个位置前插入新的元素e
int ListInsert (SeqList * L, int pos, int val)
{
ElemType * newbase;
ElemType * p;
ElemType * q;
// 6.1 首先判断链表L是否为空且插入的位置是否正确
if ((pos < 1) || (pos > L->length + 1))
{
return -1;
}
if (L->length >= L->size)
{
newbase = (ElemType *) realloc (L->elem, (LISTINCREMENT + L->size) * sizeof (ElemType));
if (newbase == NULL)
{
return -1;
}
L->elem = newbase;
L->size += LISTINCREMENT;
}
// 6.3 插入元素
// 6.3.1 首先找到带插入元素的位置 ,直接进行指针插入运算
q = L->elem + pos - 1;
// 6.3.2 将pos位置的元素都向后移动一位
for (p = L->elem + L->length - 1; p >= q; --p)
{
*(p - 1) = * p;
}
*q = val;
L->length += 1;
return 0;
}
// 删除L中的元素
ElemType ListDelete (SeqList * L, int pos)
{
ElemType * p;
ElemType * q;
int val;
if (pos < 1 || pos > L->length)
{
return 10086;
}
p = L->elem + pos - 1;
val = *p;
q = L->elem + L->length - 1;
for (; p <= q; p ++)
{
*(p - 1) = * p;
}
L->length -= 1;
return val;
}
// 返回L中的第i个元素
ElemType GetElem (SeqList * L, int pos)
{
if (pos < 1 || pos > L->length)
{
return -1;
}
return * (L->elem + pos - 1);
}
//
int LocateElem (SeqList * L, ElemType val, int (Compare)(ElemType, ElemType))
{
int i = 1;
while (i <= L->length && !Compare (val, * (L->elem + i - 1)))
{
i ++;
}
if (i <= L->length)
{
return i;
}
else
return 0;
}
int Compare(ElemType a, ElemType b)
{
if (a == b)
return 1;
else
return 0;
}
void ListUnion (SeqList * LA, SeqList * LB)
{
int La_len = 0;
int Lb_len = 0;
int i = 0;
ElemType val = 0;
La_len = ListLength (LA);
Lb_len = ListLength (LB);
for (i = 1; i <= Lb_len; i++)
{
val = GetElem (LB, i);
if (LocateElem (LA, val, Compare) == 0)
{
ListInsert (LA, ++La_len, val);
}
}
}
测试程序
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
// 因为list没有地址,只是声明了,所以此处不能声明指针变量
SeqList LA;
SeqList LB;
int i = 0;
// 1. 初始化
InitList (&LA);
InitList (&LB);
// 2. 赋值元素
for (i = 1; i <= 5; i++)
ListInsert (&LA, i, i * 2);
printf ("LA :");
for (i = 1; i <= 5; i++)
printf ("%d ", GetElem(&LA, i)) ;
printf ("\n");
for (i = 1; i <= 5; i++)
ListInsert (&LB, i, i);
printf ("LB :");
for (i = 1; i <= 5; i++)
printf ("%d ", GetElem(&LB, i)) ;
printf ("\n");
ListUnion (&LA, &LB);
printf ("The List A :");
for (i = 1; i <= ListLength (&LA); i++)
printf ("%d ", GetElem(&LA, i)) ;
printf ("\n");
return 0;
}