1.数据结构一之线性表之顺序表的基本运算

1. 结构封装

#include "stdio.h"
#include "malloc.h"

#define MAXSIZE  100
typedef int DataType;

typedef struct node
{ 
	DataType  data[MAXSIZE];
	int  length;
} SeqList, * PSeqList;

现在Seqlist已经被定义为一个复杂的数据类型,下面可以直接当做数据类型使用
PSeqList则为这种复杂数据类型的指针形式

2.顺序表的创建

/*══════════════════════════════════════╗
║创建一顺序表,入口参数无,返回一个指向顺序表的指针,指针值为零表示分配空间失败 ║ 
╚══════════════════════════════════════*/
/*这里只是建立一张空表,此时表中没有元素,元素的录入需要在主函数中进行插入操作*/
/*
(PSeqList)为强制类型转换,
   sizeof为获取类型对象所占字节数,通常用来查看变量,数组,或结构体等所占的字节个数。
(类型 *)malloc(size)分配内存空间函数,
  在内存的动态存储区域分配一块长为“size”字节的连续区域,
  函数返回值为该区域的首地址,用free释放
*/
PSeqList  Init_SeqList(void)
{  
	PSeqList  PL;  /*定义一个指向SeqList(线性表)类型的指针方便与实现信息的回送*/
	PL = (PSeqList)malloc(sizeof(SeqList));
	if (PL != NULL)       /*若PL=0表示分配失败*/
		PL->length = 0;   /*分配成功,置长度为0*/
	return (PL); /*返回的是一个指向顺序表的指针*/
}
/*当然为了可以在初始化线性表的时候,直接把录入数据的代码放入其中,这样就体现了主函数的简介性*/
//顺序表的建立:
void CreateList(SeqList *L)  /*参数同 PSeqList L */
{
	int i;
	printf("\n L->length= ");
	scanf("%d",&(L->length)); /*先输入需要输入得表数据个数*/
	for(i=1;i<=L->length;i++) /*循环输入数据*/
	{
		printf("\n data[%d]= ",(i-1));/*格式控制*/
		scanf("%d",&(L->data[i-1]));// 输入数据
	}
}

3.销毁顺序表

/*══════════════════════════════════════╗
║销毁顺序表,入口参数:为要销毁的顺序表指针地址,无返回值                      ║ 
╚══════════════════════════════════════*/
void Destroy_SeqList(PSeqList *PL)
{
	if (PL && *PL) /*先判断线性表的指针和指针的地址是否为NULL*/
		free(*PL); /*释放空间(先释放线性表指针的地址空间)*/
	*PL = NULL; /*然后将线性表的指向置空*/
	return;
}

4.顺序表的长度

/*══════════════════════════════════════╗
║求顺序表的长度,入口参数:为顺序表指针,返回表长,-1表示表不存在               ║ 
╚══════════════════════════════════════*/
int Length_SeqList(PSeqList PL)
{
	if (PL)
		return (PL->length);
	return (-1);
}

5.顺序表的检索

/*══════════════════════════════════════╗
║顺序表检索,入口参数:为顺序表指针,检索元素,返回元素位置,-1表示表不存在,     ║ 
║  0表示查找失败                                                             ║
╚══════════════════════════════════════*/
int Location_SeqList(PSeqList PL, DataType  x)
{
	int i = 0;
	if(!PL)
	{
		printf("表不存在");
		return (-1);  /*表不存在,不能检索*/
	}
	
	while (i < PL->length && PL->data[i] != x)//这句好好记着
		i++;
	//循环结束后  i 的值为要查找的元素的下标
	if (i >= PL->length)      return 0;/*查找失败*/
	else      return (i + 1);
}

6.在顺序表的指定位置插入元素

/*══════════════════════════════════════╗
║在顺序表的第i个位置前插入x,入口参数:顺序表指针,插入位置,插入元素,返回标志 ║
║1表示成功,0表示插入位置不合法,-1表示表不存在, -2表示溢出                                                       ║
╚══════════════════════════════════════*/
int  Insert_SeqList(PSeqList PL,int i, DataType  x)
{   //注意传入的i表示的意义
	int j;
	//i--; //操作后i为元素下标  
	if (!PL) {
		printf("表不存在");
		return(-1);
	}        /*表不存在,不能插入*/
	if (PL->length >= MAXSIZE) {
		printf("表溢出");
		return(-2);
	}     /*表空间已满,不能插入*/
	if (i<1 || i> PL->length + 1)
	{     /*检查插入位置的合法性*/
		printf("插入位置不合法");
		return(0);
	}
	for (j = PL->length - 1; j >= i - 1; j--) /*这里注意j的界值与i的关系*/
		PL->data[j + 1] = PL->data[j];      /* 移动元素 */
    //PL->data[i] = x; //作用同下 
	PL->data[i - 1] = x;        /*新元素插入*/
	PL->length++;     /*表长加 1*/
	return (1);       /*插入成功,返回*/
}

7.顺序表中的元素删除

/*══════════════════════════════════════╗
║顺序表删除,入口参数:顺序表指针,删除元素位置,返回标志1表示成功,0表示删除位置║
║不合法,-1表示表不存在                                                       ║
╚══════════════════════════════════════*/
int Delete_SeqList(PSeqList PL,int i)
{
	int  j;
	if (!PL) 
	{
		printf("表不存在");
		return(-1);
	} /*表不存在,不能删除元素*/
	if (i<1 || i> PL->length) 
	{ /*检查删除位置的合法性*/
		printf("删除位置不合法");
		return(0);
	}
	for (j = i; j < PL->length; j++)
		PL->data[j - 1] = PL->data[j]; /*向上移动*/
	PL->length--;
	return (1);        /*删除成功*/
}

8.顺序表的遍历输出

/*══════════════════════════════════════╗
║顺序表遍历输出,入口参数:顺序表指针,返回标志1表示成功,-1表示表不存在        ║
╚══════════════════════════════════════*/
int Print_SeqList(PSeqList PL)
{
	int i = 0;
	if (!PL) 
	{
		printf("表不存在");
		return(-1);
	} 
	while (i < PL->length)
	{
		printf("%d ", PL->data[i]);
		i++;
	}
	return(1);
}

9.主函数测试实现

int  main( )
{
	PSeqList PL;
	int i, ret;
	DataType e;

	printf("▼1\n▲函数 Init_SeqList 测试...\n");		//1.函数Init_SeqList测试
	{
		printf("初始化顺序表 L ...\n");					 
		PL = Init_SeqList();
		printf("\n");	
	}
	getchar(); //接受任何一个字符  执行下一个功能  作为手动分隔符
		
	printf("▼5\n▲函数 Insert_SeqList 测试...\n");		//5.函数Insert_SeqList测试
	{
		for(i=1; i<=6; i++)									
		{
			printf("作为示范,在 L 第 %d 个位置插入 \"%d\"...\n", i, 2*i);
			ret = Insert_SeqList(PL, i, 2*i);
			if(ret==0)  
				printf("插入位置不合法\n");
			else if(i==-1) 
				printf("表不存在\n");
			else if(i==-2) 
				printf("溢出\n");
		}
		printf("\n");	
	}
	getchar();

	printf("▼3\n▲函数 Length_SeqList 测试...\n");		//3.函数Length_SeqList测试
	{
		i = Length_SeqList(PL);
		printf(" L 的长度为 %d \n", i);
	}
	getchar();
	
	printf("▼3\n▲函数 Delete_SeqList 测试...\n");		//3.函数Delete_SeqList测试
	{
		int pos = 0;
		printf("删除前:L 中的元素为:L = ");						 
		Print_SeqList(PL);
		printf("\n请输入要删除元素的位置:\n");
		scanf("%d", &pos);
		Delete_SeqList(PL, pos);
		
		printf("删除后:L 中的元素为:L = ");						 
		Print_SeqList(PL);
		printf("\n\n");
	}
	
	getchar();
	printf("▼4\n▲函数 Location_SeqList 测试...\n");	  	//4.函数Location_SeqList测试
	{
		printf("请输入要查找的元素:");
		scanf("%d", &e);
		i = Location_SeqList(PL, e);
		if(i==0)  
			printf("查找失败\n");
		else if(i==-1) 
			printf("表不存在\n");
		else
			printf(" L 中要查找的元素的位置为 %d \n", i); 
		printf("\n");
	}

	getchar();
	printf("▼2\n▲函数 DestroyList_Sq 测试...\n");		//2.函数DestroyList_Sq测试
	{
		printf("销毁 L 前:");
		Print_SeqList(PL);
		Destroy_SeqList(&PL);
		printf("销毁 L 后:");
		Print_SeqList(PL);  
		printf("\n");
	}
	return 0 ;
}

10.运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值