数据结构与算法-4-链表的基本操作-增

数据结构与算法-4-链表的基本操作-增

注意:以下为顺序存储结构实现

  1. 相关的头文件
/*以下为头文件SqList.h是用于定义相关函数的头文件*/
#pragma once
#define LIST_INIT_SIZE 100/*初始线性表的尺寸大小为100*/
#define LIST_INCREAMENT 10/*每次增量为10*/
typedef enum  {
	success,fatal,fail,range_error
}Status;/*状态参量的定义*/
typedef int ElemType;
typedef struct SqList
{
	ElemType* elem;/*数据*/
	int length;/*顺序链表的长度*/
	int list_size;/*该顺序链表所占的总空间大小*/
}SqList,*Ptr,*SqListPtr;
Status List_Init(SqListPtr L);/*对线性表初始化*/
void List_Destory(SqListPtr L);/*归还线性表*/
void List_Clear(SqListPtr L);/*清空线性表*/
Status List_Retrival(SqListPtr L,int pos,ElemType *elem);/*查找某元素位置*/
Status List_Locate(SqListPtr L,ElemType elem,int *pos);/*插入元素*/
void List_Print(SqListPtr L);/*打印函数*/
/*以下为头文件TestSqlist.h是用于测试的头文件*/
#pragma once
#include"Sqlist.h"
Status Test_CreateList(SqListPtr list,ElemType data[],int n);
Status Test_ClearList(SqListPtr list);

2.相关的C文件

/*是Sqlist.c用于测试Sqlist.h中的函数*/
#include<stdio.h>
#include<stdlib.h>
#include"Sqlist.h"

Status List_Init(SqListPtr L)
{
	Status s = fail;
	if (L!=NULL)
	{
		L->elem = (ElemType*)malloc((LIST_INIT_SIZE+1) * sizeof(ElemType));/*给线性表分配空间*/
		if (L->elem)
		{
			L->list_size = LIST_INIT_SIZE;/*分配成功则线性表的总空间大小为100*/
			L->length = 0;/*初期元素个数为零*/
			s = success;
		}
	}
	return s;
}
void List_Destory(SqListPtr L)
{
	if (L)/*线性表存在*/
	{
		if (L->elem)/*这个空间存在*/
		{
			free(L->elem);
			L->elem = NULL;
			L->length = 0;
		}
	}
}
void List_Clear(SqListPtr L)
{
	if (L)
	{
		L->length = 0;
	}
}
bool List_Empty(SqListPtr L)
{
	return (L->length == 0);
}
int List_size(SqListPtr L)
{
	return L->length;
}
Status List_Insert(SqListPtr L, int pos, ElemType elem)
{
	Status s = range_error;
	int i;
	if (L)
	{
		if (pos >= 1 && pos <= L->length+1)/*在最后一个元素后面插入也是可以的*/
		{
			if (L->length < L->list_size)/*线性表的长度小于所分配的空间即可插入*/
			{
				for (i = L->length; i >= pos; i--)
				{
					L->elem[i + 1] = L->elem[i];/*所有元素向后移动一位*/
				}
				L->elem[i+1] = elem;
				L->length += 1;
				s = success;
			}
		}
	}
	return s;
}
void List_Print(SqListPtr L)
{
	int i;
	if (L)
	{
		for (i = 1; i<=L->length; i++)
		{
			printf("%d ", L->elem[i]);
			if (i % 10 == 0)
			{
				printf("\n");  
			}
		}
	}
}
/*是TestSqList.c用于测试TestSqList.h中的函数*/
#include<stdio.h>
#include<stdlib.h>
#include"TestSqList.h"
Status Test_CreateList(SqListPtr list, ElemType data[], int n)
{
	Status s = fail;
	s = List_Init(list);
	int i;
	if (s == success)
	{
		for (i = 1; i <= n; i++)
		{
			s = List_Insert(list, i, data[i]);
			if (s != success)
			{
				break;
			}
		}
		List_Print(list);
	}
	return s;
}
Status Test_ClearList(SqListPtr list)
{
	Status s = fail;
	if (!List_Empty(list))
	{
		List_Clear(list);
		if (List_Empty(list))
		{
			s = success;
		}
	}
	return s;
}

3.主函数的实现

#include<stdio.h>
#include<stdlib.h>
#include"TestSqList.h"
int main()
{
	int opt=1;/*选项*/
	SqListPtr list;
	int pos, size,i;
	Status s;
	ElemType e, * data;
	while (opt!=6) {
		printf("请输入选项\n");
		printf("1:测试建立线性表\n");
		printf("2:测试清空线性表\n");
		printf("3:测试求位置的线性表元素值及其前驱后继\n");
		printf("4;测试查询某元素的位置\n");
		printf("5:测试求线性表的长度\n");
		printf("6:结束程序\n");
		printf("*****************************************\n");
		scanf_s("%d", &opt);
		switch (opt)
		{
		case 1:
			printf("线性表长度\n");
			scanf_s("%d", &size);
			data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
			if (data == NULL) break;
			printf("线性表元素\n");
			for (i = 1; i <=size; i++)
			{
				scanf_s("%d", &data[i]);

			}
			s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
			if (s != success) printf("建立线性表失败\n");
			free(data);
			List_Destory(&list);
			break;
		case 2:
			printf("线性表长度\n");
			scanf_s("%d", &size);
			data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
			if (data == NULL) break;
			printf("线性表元素\n");
			for (i = 1; i <= size; i++)
			{
				scanf_s("%d", &data[i]);

			}
			s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
			if (s == success)
			{
				if (!List_Empty(&list))
				{
					List_Clear(&list);
					if (List_Empty(&list))
					{
						printf("已经清空线性表\n");
					}
				}
			}
			free(data);
			List_Destory(&list);
			break;
		case 3:
			printf("线性表长度\n");
			scanf_s("%d", &size);
			data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
			if (data == NULL) break;
			printf("线性表元素\n");
			for (i = 1; i <= size; i++)
			{
				scanf_s("%d", &data[i]);

			}
			s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
			if (s == success)
			{
				printf("输入待查找元素的位置\n");
				scanf_s("%d", &pos);
				Test_Retrivalpriornext(&list, pos);

			}
			free(data);
			List_Destory(&list);
			break;
		case 4:
			printf("线性表长度\n");
			scanf_s("%d", &size);
			data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
			if (data == NULL) break;
			printf("线性表元素\n");
			for (i = 1; i <= size; i++)
			{
				scanf_s("%d", &data[i]);

			}
			s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
			if (s == success)
			{
				printf("输入待查询的元素值\n");
				scanf_s("%d", &e);
				Test_Locate(&list, e);
			}
			free(data);
			List_Destory(&list);
			break;
		case 5:
			printf("线性表长度\n");
			scanf_s("%d", &size);
			data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
			if (data == NULL) break;
			printf("线性表元素\n");
			for (i = 1; i <= size; i++)
			{
				scanf_s("%d", &data[i]);

			}
			s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
			if (s == success) 
			{
				Test_Size(&list);
			}
			free(data);
			List_Destory(&list);
			break;
		default:
			break;
		}
	}
	return 0;
}

4.感谢戴波老师,欢迎交流指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。第二部分“数据结构”(第3~5章)讲解算法分析中必须掌握的数据结构知识,主要包括基本数据结构、抽象数据结构、递归和树。第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征。第四部分“搜索”(第12~16章)在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。 书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习。作者用简洁的实现将理论和实践成功地结合了起来,这些实现均可在真实应用上测试,使得本书自问世以来备受程序员的欢迎。 本书可作为高等院校计算机相关专业算法数据结构课程的教材和补充读物,也可供自学之用。 目录 出版者的话 译者序 前言 第一部分 基础知识  第1章 引言   1.1 算法   1.2 典型问题——连通性   1.3 合并一查找算法   1.4 展望   1.5 主题概述  第2章 算法分析的原理   2.1 实现和经验分析   2.2 算法分析   2.3 函数的长   2.4 大O符号   2.5 基本递归方程   2.6 算法分析示例   2.7 保证、预测及局限性 第二部分 数据结构  第3章 基本数据结构   3.1 构建组件   3.2 数组   3.3 链表   3.4 链表的基本处理操作   3.5 链表的内存分配   3.6 字符串   3.7 复合数据结构  第4章 抽象数据类型   4.1 抽象对象和对象集   4.2 下推栈ADT   4.3 栈ADT客户示例   4.4 栈ADT的实现   4.5 创建一个新ADT   4.6 FIFO队列和广义队列   4.7 复制和索引项   4.8 一级ADT   4.9 基于应用的ADT示例   4.10 展望  第5章 递归与树   5.1 递归算法   5.2 分治法   5.3 动态规划   5.4 树   5.5 树的数学性质   5.6 树的遍历   5.7 递归二叉树算法   5.8 图的遍历   5.9 综述 第三部分 排序  第6章 基本排序方法   6.1 游戏规则   6.2 选择排序   6.3 插入排序   6.4 冒泡排序   6.5 基本排序方法的性能特征   6.6 希尔排序   6.7 对其他类型的数据进行排序   6.8 索引和指针排序   6.9 链表排序   6.10 关键字索引统计  第7章 快速排序   7.1 基本算法   7.2 快速排序算法的性能特征   7.3 栈大小   7.4 小的子文件   7.5 三者取中划分   7.6 重复关键字   7.7 字符串和向量   ……  第8章 归并与归并排序  第9章 优先队列和堆排序  第10章 基数排序  第11章 特殊用途的排序方法 第四部分 搜索  第12章 符号表和二叉搜索树  第13章 平衡树  第14章 散列  第15章 基数搜索  第16章 外部搜索
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值