数据结构实践——顺序表应用

本文通过四个项目深入探讨顺序表的操作,包括基本运算、建立算法库、求集合并集以及特定条件的元素处理。重点讲解了如何实现线性表的长度计算、指定位置元素获取、元素查找、插入与删除等操作,以及解决实际问题如合并集合、调整奇偶数顺序时的高效算法设计。同时,反思了在实现过程中遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

【项目1 - 顺序表的基本运算】

(1)无从下手时,要找到参考,这是要“借力”;(2)找到参考,并未解决问题,观摩之后,丢开参考,自行完成,这是根本的目标。用这样的“抄之有道”,抄来的在心里,最终的成果,来自你的心中、脑中和手中。 
(2)在已经创建线性表的基础上,求线性表的长度ListLength、求线性表L中指定位置的某个数据元素GetElem、查找元素LocateElem的算法都可以实现了。就在原程序的基础上增加: 
 增加求线性表的长度ListLength的函数并测试; 
 增加求线性表L中指定位置的某个数据元素GetElem的函数并测试; 
 增加查找元素LocateElem的函数并测试; 
(3)其余的4个基本运算:插入数据元素ListInsert、删除数据元素ListDelete、初始化线性表InitList、销毁线性表DestroyList都可以同法完成,请自行安排实践路线。 

代码如下

list.h

#define MaxSize 50
typedef int ElemType;
typedef struct
{
	ElemType data[MaxSize];
	int length;
}Sqlist;

void CreateList(Sqlist *&L, int i,ElemType a[]);//用数组创建线性表
void DispList(Sqlist *L);//输出线性表
bool ListEmpty(Sqlist *L);//判断线性表是否为空
int ListLength(Sqlist *L);//求线性表的长度
int GetElem(Sqlist *L, int i);//求指定位置的数据元素
bool LocateElem(Sqlist *L, int x);//查找元素
bool ListInsert(Sqlist *&L, int i, int x);//插入数据元素
bool ListDelete(Sqlist *&L, int x);//删除数据元素
void InitList(Sqlist *&L);//初始化线性表
void DestroyList(Sqlist *&L);//销毁线性表

#endif 

list.cpp

#include <stdio.h>
#include <malloc.h>
#include "list.h"

//用数组创建线性表
void CreateList(Sqlist *&L,int n,ElemType a[])
{
	int i;
	L = (Sqlist *)malloc(sizeof(ElemType));
	L->length = n;
	for ( i = 0; i < L->length; i++)
	{
		L->data[i] = a[i];
	}
	
}

//输出线性表
void DispList(Sqlist *L)
{
	int i;
	if (ListEmpty(L))
	{
		return;
	}
	for (i = 0; i < L->length; i++)
	{
		printf("%d", L->data[i]);
	}
	//return 0;
}


//判断线性表是否为空
bool ListEmpty(Sqlist *L)
{
	if (L->length == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//求线性表的长度
int ListLength(Sqlist *L)
{
	if (ListEmpty(L))
	{
		return 0;
	}
	else
	{
		return L->length;
	}
	
}

//求指定位置的数据元素
int GetElem(Sqlist *L, int i)
{
	if (ListEmpty(L)&&(i<1||i>L->length))//if(ListEmpty(L));
	{
		return 0;
	}
	return L->data[i-1];
}

//查找元素
bool LocateElem(Sqlist *L, int x)
{
	for (int i=0 ; i < L->length; i++)
	{
		if (L->data[i] == x)
			return true;
		else
			return false;
	}
}

//插入数据元素
bool ListInsert(Sqlist *&L, int i, int x)
{
	//判断是否存在
	if (i<1 || i>L->length+1)//思维不严密写成i<1||i>L->length,没考虑到尾的特殊情况
	{
		return false;
	}
	i--;
	
	for (int j = L->length; j > i; j--)
	{
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = x;
	L->length++;
	return true;

}

//删除特定数据元素值
bool ListDelete(Sqlist *&L, int x)
{
	int i = 0;
	if(ListEmpty(L))
	{
		return false;
	}
	while (i < L->length )
	{
 		if (L->data[i] == x)
			break;	
		i++;
	}
	for ( int j = i; j < L->length; j++)
	{
		L->data[j] = L->data[j + 1];
	}
	L->length--;
	return true;
}

//初始化线性表
void InitList(Sqlist *&L)
{
	L = (Sqlist *)malloc(sizeof(ElemType));//漏掉了
	L->length = 0;
	printf("\n此线性表初始化完毕。");
}

//销毁线性表
void DestroyList(Sqlist *&L)
{
	free(L);//没想起来
	printf("\n此线性表销毁完毕。");
}
main.cpp


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值