数据结构学习笔记(一)线性表部分

2023年9月23日,开始记录数据结构学习中示例的一些代码,代码实现是基于B站上王卓老师的课程进行整理撰写的,一定要坚持下去!坚持更新(一些碎碎念)

目录

例题1:线性表合并(不考虑元素顺序)

一、首先对顺序表一些常见的操作进行定义

二、编写排序的函数

三、补充一些头文件

例题2. 有序表合并

一、排序函数

二、主函数


例题1:线性表合并(不考虑元素顺序)

问题描述:已知两个线性表La和Lb分别表示两个集合A和B

A=(7,5,3,11)

B=(2,6,3)

求出合并后的集合A=(7,5,3,11,2,6)

解题思路:首先依次取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中的数据元素仍按值非递减有序排列

A=(3,5,8,11)

B=(2,6,8,11,15,20)

合并后的集合:

C=(2,3,5,6,8,8,9,11,11,15,20)

解题思路:此处定义一个新的线性表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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值