2023年9月23日,开始记录数据结构学习中示例的一些代码,代码实现是基于B站上王卓老师的课程进行整理撰写的,一定要坚持下去!坚持更新(一些碎碎念)
目录
例题1:线性表合并(不考虑元素顺序)
问题描述:已知两个线性表La和Lb分别表示两个集合A和B
求出合并后的集合
解题思路:首先依次取B中的元素与A进行比较,如果一样则不更新A,否则将B中的元素添加至A表的尾部。
下面是具体的代码实现:
一、首先对顺序表一些常见的操作进行定义
1.定义顺序表结构
typedef int Elemtype;
typedef struct Sqlist
{
Elemtype* base;
int length;
}Sqlist;
2.初始化顺序表
Status InitList(Sqlist* L, int n)
{
Elemtype e;
L->base = (Elemtype*)malloc(sizeof(Elemtype) * SQLMAXSIZE);
if (!L->base)
return OVERFLOW;
L->length = 0;
for (int i = 1; i < n+1; i++)
{
scanf("%d", &e);
InsertList(L, i, e); //插入函数,后面进行补充
}
return OK;
}
3.获取元素
Status GetElem(Sqlist* L, int position, Elemtype* e)
{
if (position<1 || position>L->length)
return ERROR;
*e = L->base[position - 1];
return OK;
}
4.插入元素
Status InsertList(Sqlist* L, int position, Elemtype e)
{
if (position<1 || position>L->length + 1)
return ERROR;
for (int i = L->length; i > position; i--)
{
L->base[i] = L->base[i - 1];
}
L->base[position - 1] = e;
L->length++;
return OK;
}
5.删除元素
Status DelList(Sqlist* L, int position, Elemtype* e)
{
if (position<1 || position>L->length)
return ERROR;
*e = L->base[position - 1];
for (int i = position; i < L->length; i++)
{
L->base[i - 1] = L->base[i];
}
L->length--;
return OK;
}
6.销毁、清空及检查为空
Status DestroyList(Sqlist* L)
{
if (!L->base)
{
return ERROR;
}
else
{
free(L->base);
return OK;
}
}
Status ClearList(Sqlist* L)
{
L->length = 0;
return OK;
}
Status ListisEmpty(Sqlist* L)
{
if (0 == L->length)
return TRUE;
else
return FLASE;
}
二、编写排序的函数
void MergeList(Sqlist* La, Sqlist* Lb)
{
if (!Lb->length)
return ERROR;
for (int i = 1; i < Lb->length+1; i++)
{
Elemtype e;
GetElem(Lb, i, &e);
if (!LocateElem(La, e))
{
La->base[La->length++] = e;
}
}
}
打印输出线性表
void Traverse(Sqlist *L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d", L->base[i]);
}
}
主函数
int main()
{
Sqlist La;
Sqlist Lb;
InitList(&La, 4);
InitList(&Lb, 3);
MergeList(&La, &Lb);
Traverse(&La);
system("pause");
return 0;
}
三、补充一些头文件
define.h
#pragma once
#ifndef _DEFINE_H
#define _DEFINE_H
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#endif
例题2.有序表合并
问题描述:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列
合并后的集合:
解题思路:此处定义一个新的线性表Lc,依次从La或Lb中摘取元素值较小的结点加入到Lc的最后,直到La或Lb中一个表变空为止,然后将La或Lb其中一个表的剩余结点一次插入在Lc的最后。
一、排序函数
void MergeList_Sq(Sqlist* La, Sqlist* Lb,Sqlist *Lc)
{
Elemtype* pa = La->base, * pa_last = pa + La->length - 1;
Elemtype* pb = Lb->base, * pb_last = pb + Lb->length - 1;
Lc->length = La->length + Lb->length;
Elemtype* pc = Lc->base;
while (pa < pa_last && pb < pb_last)
{
if (*pa < *pb)
*(pc++) = *(pa++); //循环中指针变量的赋值等价于* pc = *pa; pc++;pa++;
else
*(pc++) = *(pb++);
}
while (pa <= pa_last)
*(pc++) = *(pa++);
while (pb <= pb_last)
*(pc++) = *(pb++);
}
二、主函数
int main()
{
Sqlist La, Lb, Lc;
InitList(&La, 4);
InitList(&Lb, 5);
InitList(&Lc, 0);
MergeList_Sq(&La, &Lb, &Lc);
Traverse(&Lc);
system("pause");
return 0;
}