【数据结构】实现顺序表(c语言)

头文件:

#ifndef _SEQLIST_H
#define _SEQLIST_H

#include <stdio.h>

#define INIT_SIZE 8

typedef struct SeqList
{
	int *base;
	size_t size;
	size_t capacity;
}SeqList;

// 要实现的函数
void InitList(SeqList *list);
int isfull(SeqList *list);
int isempty(SeqList *list);

void show_list(SeqList *list);
void tail_insert(SeqList *list,int x);
void head_insert(SeqList *list,int x);
void sort(SeqList *list);
void head_delete(SeqList *list);
void tail_delete(SeqList *list);
void pos_insert(SeqList *list,int x,int pos);
void val_insert(SeqList *list, int x);
void pos_delete(SeqList *list,int pos);
int find(SeqList *list,int x);
void val_delete(SeqList *list,int x);
int length(SeqList *list);
void reverse(SeqList *list);
void clear(SeqList *list);
void destroy(SeqList *list);
void quit_system(SeqList *list,int* x);

#endif

fun:

#include "SeqList.h"

// 定义两个返回值接收判断函数的结果
int fret = isfull;
int eret = isempty;

// 初始化顺序表
void InitList(SeqList *list)
{
	list->size = 0;
	list->capacity = INIT_SIZE;
	list->base = (int*)malloc(sizeof(int)*list->capacity);
}

// 判断顺序表是否满
int isfull(SeqList *list)
{
	if (list->size >= list->capacity)
	{
		return -1;
	}
	else
		return 0;
}

// 判断顺序表是否空
int isempty(SeqList *list)
{
	if (list->size == 0)
	{
		return -1;
	}
	else
		return 0;
}

// 显示
void show_list(SeqList *list)
{
	int i;
	if (list->size == 0)
	{
		printf("the table is empty!\n");
	}
	for (i = 0; i < list->size; ++i)
	{
		printf("%d  ", list->base[i]);
	}
	printf("\n");
}

// 尾插
void tail_insert(SeqList *list,int x)
{
	if (fret == -1)
	{
		printf("the table is full,can not insert!\n");
		return;
	}
	list->base[list->size] = x;
	list->size++;
}

// 头插
void head_insert(SeqList *list,int x)
{
	int i;
	if (fret == -1)
	{
		printf("the table is full,can not insert!\n");
		return;
	}
	for (i = list->size; i > 0; --i)
	{
		list->base[i] = list->base[i - 1];
	}
	list->base[0] = x;
	list->size++;
}

// 排序
void sort(SeqList *list)
{
	int i;
	int j;
	int temp;
	for (i = 1; i < list->size; ++i)
	{
		for (j = 0; j < list->size - i; ++j)
		{
			if (list->base[j]>list->base[j + 1])
			{
				temp = list->base[j];
				list->base[j] = list->base[j + 1];
				list->base[j + 1] = temp;
			}
		}
	}
}

// 头删
void head_delete(SeqList *list)
{
	int i;
	if (eret == -1)
	{
		printf("the table is empty,can not delete!\n");
		return;
	}
	for (i = 0; i < list->size; ++i)
	{
		list->base[i] = list->base[i + 1];
	}
	list->size--;
}

// 尾删
void tail_delete(SeqList *list)
{
	if (eret == -1)
	{
		printf("the table is empty,can not delete!\n");
		return;
	}
	list->size--;
}

// 按位插入
void pos_insert(SeqList *list,int x,int pos)
{
	int i;
	if (fret == -1)
	{
		printf("the table is full,can not insert!\n");
		return;
	}
	if (pos<0 || pos>list->size)
	{
		printf("the position is illegal!\n");
		return;
	}
	else
	{
		for (i = list->size; i > pos; --i)
		{
			list->base[i] = list->base[i - 1];
		}
		list->base[pos] = x;
		list->size++;
	}
}

// 按值插入
void val_insert(SeqList *list,int x)
{
	if (fret == -1)
	{
		printf("the table is full,can not insert!\n");
		return;
	}
	tail_insert(list,x);
	sort(list);
}

// 按位删除
void pos_delete(SeqList *list,int pos)
{
	int i;
	if (eret == -1)
	{
		printf("the table is empty,can not delete!\n");
		return;
	}
	if (pos<0 || pos>list->size)
	{
		printf("the position is illegal!\n");
		return;
	}
	else
	{
		for (i = pos; i < list->size; ++i)
		{
			list->base[i] = list->base[i + 1];
		}
		list->size--;
	}
}

// 查找
int find(SeqList *list,int x)
{
	int i;
	for (i = 0; i < list->size; ++i)
	{
		if (list->base[i] == x)
		{
			return i;
		}
	}
	printf("the number is not exit!\n");
	return 0;
}

// 按值删除
void val_delete(SeqList *list,int x)
{
	int ret = find(list, x);
	int i;
	if (eret == -1)
	{
		printf("the table is empty,can not delete!\n");
		return;
	}
	if (ret == -1)
	{
		printf("the number is not exist!\n");
		return;
	}
	else
	{
		for (i = ret; i <list->size; ++i)
		{
			list->base[i] = list->base[i + 1];
		}
		list->size--;
	}
}

// 求长度
int length(SeqList *list)
{
	return list->size;
}

// 反转
void reverse(SeqList *list)
{
	int temp;
	int i = 0;
	int j = list->size - 1;
	if (eret == -1)
	{
		printf("the table is empty,can not operate!\n");
		return;
	}
	while (i < j)
	{
		temp = list->base[i];
		list->base[i] = list->base[j];
		list->base[j] = temp;
		++i;
		--j;
	}
}

// 清空
void clear(SeqList *list)
{
	list->size = 0;
}

// 摧毁
void destroy(SeqList *list)
{
	list->base = NULL;
}

// 退出系统
void quit_system(SeqList *list,int *x)
{
	*x = 0;
}

主函数:

// c实现顺序表

#include "SeqList.h"

int main()
{
	SeqList mylist;
	InitList(&mylist);
	int input = 1;
	int insert = 0;
	int pos = 0;
	while (input)
	{
		printf("*********************************************************************\n");
		printf("*     [1] show_list                       [2] tail_insert           *\n");
		printf("*     [3] head_insert                     [4] sort                  *\n");
		printf("*     [5] head_delete                     [6] tail_delete           *\n");
		printf("*     [7] pos_insert                      [8] val_insert            *\n");
		printf("*     [9] pos_delete                      [10] find                 *\n");
		printf("*     [11] val_delete                     [12] length               *\n");
		printf("*     [13] reverse                        [14] clear                *\n");
		printf("*     [15] destroy                        [16] quit_system          *\n");
		printf("*********************************************************************\n");
		printf("please enter your choose:");
		scanf_s("%d", &input);
		switch (input)
		{
			case 1:
				show_list(&mylist);
				break;
			case 2:
				printf("please enter the number want to insert:\n");
				while (scanf_s("%d", &insert),insert != -1)
				{
					tail_insert(&mylist, insert);
				}
				break;
			case 3:
				printf("please enter the number want to insert:\n");
				while (scanf_s("%d", &insert), insert != -1)
				{
					head_insert(&mylist, insert);
				}
				break;
			case 4:
				sort(&mylist);
				break;
			case 5:
				head_delete(&mylist);
				break;
			case 6:
				tail_delete(&mylist);
				break;
			case 7:
				printf("please enter the number want to insert:\n");
				scanf_s("%d", &insert);
				printf("please enter the position :\n");
				scanf_s("%d", &pos);
				pos_insert(&mylist, insert, pos);
				break;
			case 8:
				printf("please enter the number want to insert:\n");
				scanf_s("%d", &insert);
				val_insert(&mylist, insert);
				break;
			case 9:
				printf("please enter the position :\n");
				scanf_s("%d", &pos);
				pos_delete(&mylist, pos);
				break;
			case 10:
				printf("please enter the number want to find:\n");
				scanf_s("%d", &insert);
				printf("at the %d\n", find(&mylist, insert));
				break;
			case 11:
				printf("please enter the number want to delete:\n");
				scanf_s("%d", &insert);
				val_delete(&mylist, insert);
				break;
			case 12:
				printf("the table's length is %d\n", length(&mylist));
				break;
			case 13:
				reverse(&mylist);
				break;
			case 14:
				clear(&mylist);
				break;
			case 15:
				destroy(&mylist);
				break;
			case 16:
				quit_system(&mylist, &input);
				break;
			default:
				break;
		}
	}
	return 0;
}

显示:

尾插:

头插:

排序:

头删:

尾删:

定位插入:

按值插入:

按位删除:

查找:

按值删除:

求长度:

反转:

清除:

退出系统:

时间: 2024-10-13 17:32:57

【数据结构】实现顺序表(c语言)的相关文章

数据结构。顺序表

#include <stdio.h>#include <stdlib.h> #define LIST_INIT_SIZE 100#define LIST_INCREMENT 10typedef struct Point   //element type{    int x;    int y;}Point;typedef Point ElemType;typedef struct          //list type{    ElemType *elem;     //data

Windows 已在 数据结构_顺序表.exe 中触发一个断点——new和delete注意事项

实现数据结构的顺序表的类时,输入,改,删,查都可以,但是最后析构函数时持续出错 错误提示"Windows 已在 数据结构_顺序表.exe 中触发一个断点" int *elem=new int(LIST_INIT_SIZE); if(!elem)cout<<"overflow"<<endl; if(leng>LIST_INIT_SIZE) cout<<"error"; else {    length=le

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链

数据结构学习---顺序表

在准备考研的时候就想发学习笔记,想来已经过了多时.现在在培训班又要展开学习,说明一件事:408是指导学习研究计算机的基础!对于编写程序而言,数据结构与算法,是关键!我想其他的组成原理,计算机网络,操作系统也很重要,这是一个system,有必要有需要学习认真的学习之.希望这个是好的开始! ---------------------------------------------------------------- 昨天晚上看浙大在网易云课上的视频,没有上过浙大的我还是非常激动,哈哈,三个短视频看

数据结构之顺序表

好不容易linux的课程结束了,下面就进入了数据结构的课程,对于没学过这本书的我,只能弱弱的说一句,数据结构真的好难,在学习的过程中,觉得最经典的一句话便是,数据结构+算法=程序.我只想说理解数据结构真的好难,太富有逻辑性了,有时候真的还需要发挥自己的空间想象能力,几天的学习,其实还算可以吧,下面我就给大家写一点线性表的基本操作吧,我尽可能的讲解的清楚一些,方便看的人有兴趣能有自己实现. #include <stdio.h> #include <stdlib.h> #include

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

【数据结构】顺序表和链表

一.顺序表 顺序表定义 :顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 顺序表可以分为静态顺序表和动态顺序表,静态较为简单,本文提供全部动态顺序表基本操作的代码. 顺序表的基本操作:

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

javascript数据结构之顺序表

关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间,然后将线性表放入其中,这样做便于线性表的存取,但是不利于插入和删除,而且在事先无法确定线性表长度的前提下可能会造成内存浪费或溢出. 这篇我是用javascript来实现线性表中的顺序表. 下面上代码: 1 var orderList = function(){ 2 var items = [];

数据结构:顺序表的基本操作

顺序表作业: #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; typedef int T; class SeqList{ private: T *data; int MaxSize; ///顺序表最多可以存放的元素个数. int last; ///顺序表最后一个元素的下标,初始值为-1. public: SeqList(int sz); void Input();