【数据结构】用C语言实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//头文件
#ifndef _SEQLIST_H
#define _SEQLIST_H

#include<stdio.h>

typedef int ElemType;

#define INIT_SIZE  8

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

int isempty(SeqList *list);
int isfull(SeqList *list);

void InitList(SeqList *list);
void push_back(SeqList *list, ElemType x);
void show_list(SeqList *list);
void push_front(SeqList *list, ElemType x);
void pop_back(SeqList *list);
void pop_front(SeqList *list);
void insert_pos(SeqList *list, ElemType x, int pos);
void quit_system(SeqList *list, int *x);
int find(SeqList *list, ElemType x);
int length(SeqList *list);
void insert_val(SeqList *list, ElemType x);
void sort(SeqList *list);
void delete_pos(SeqList *list,int pos);
void delete_val(SeqList *list, ElemType x);
void clear(SeqList *list);
void destory(SeqList *list);
void reverse(SeqList *list);

#endif

//函数文件
#include"SeqList.h"

int i;
int isempty(SeqList *list)          //检测表是否满
{
	return list->size == 0;
}
int isfull(SeqList *list)          //检测表是否空
{
	return list->size >= list->capacity;
}

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

void push_back(SeqList *list, ElemType x)     //尾插
{
	if (isfull(list))
	{
		printf("顺序表已满,不能插入!\n") ;
		return;
	}
	list->base[list->size] = x;
	list->size++;
}

void show_list(SeqList *list)                //显示
{
	if (list->size == 0)
	{
		printf("顺序表为空。\n");
		return;
	}
	for (i = 0; i<list->size; ++i)
	{
		printf("%d ", list->base[i]);
	}
	printf("\n");
}

void push_front(SeqList *list, ElemType x)    //头插
{
	if (isfull(list))
	{
		printf("顺序表已满,不能插入!\n");
		return;
	}
	for (i = list->size; i > 0; i--)
	{
		list->base[i] = list->base[i - 1];
	}
	list->base[0] = x;
	(list->size)++;
}

void pop_front(SeqList *list)                 //头删
{
	if (isempty(list))
	{
		printf("顺序表为空,不能删除\n");
		return;
	}
	for (i = 0; i < list->size; i++)
	{
		list->base[i] = list->base[i + 1];
	}
	(list->size)--;
}

void pop_back(SeqList *list)                 //尾删
{
	if (isempty(list))
	{
		printf("顺序表为空,不能删除\n");
		return;
	}
	list->size--;
}

void insert_pos(SeqList *list, ElemType x, int pos)   ////按位置插
{
	if (pos<0 || pos>list->size)
	{
		printf("插入的位置不正确。\n ");
		return;
	}
	if (isempty(list))
	{
		printf("顺序表已满,不能插入.\n");
		return;
	}
	for (i = list->size; i > pos; i--)
	{
		list->base[i] = list->base[i - 1];
	}
	list->base[pos] = x;
	list->size++;
}

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

int find(SeqList *list, ElemType x)       //查找
{
	for (i = 0; i < list->size; i++)
	{
		if (list->base[i]==x)
			return i;
	}
	return -1;
}

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

void insert_val(SeqList *list, ElemType x)    //按值插入
{
	push_back(list, x);
	sort(list);
}

void sort(SeqList *list)                  //排序
{
	if (isempty(list))
	{
		return;
	}
	for (int i = 1; i < list->size; i++)
	{
		for (int j = 0; j < list->size - i; j++)
		{
			int temp;
			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 delete_pos(SeqList *list, int pos)     //按位置删除
{
	if (isempty(list))
	{
		printf( "顺序表为空,不能删除。\n" );
		return;
	}
	if (pos < 0 || pos >= list->size)
	{
		printf("删除的位置不正确。\n");
		return;
	}
	for (int i = pos; i < list->size; ++i)
	{
		list->base[i] = list->base[i + 1];
	}
	list->size--;
}

void delete_val(SeqList *list, ElemType x)   //按值删除
{
	if (isempty(list))
	{
		printf( "顺序表为空,不能删除。\n");
		return;
	}
	int pos = find(list,x);
	if (pos == -1)
	{
		printf("未找到该数。\n");
		return;
	}
	delete_pos(list,pos);
}

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

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

void reverse(SeqList *list)              //逆序
{
	for (int i = 0, j = list->size - 1; i < list->size / 2; i++, j--)
	{
		int temp = list->base[i];
		list->base[i] = list->base[j];
		list->base[j] = temp;
	}
}

//主函数
#include"SeqList.h"

void main()
{
	SeqList mylist;
	InitList(&mylist);

	int select = 1;
	ElemType Item;
	int pos;
	while (select)
	{
		printf("****************************************************\n");
		printf("*   [1] show_list                 [2] quit_system  *\n");
		printf("*   [3] push_front                [4] push_back    *\n");
		printf("*   [5] pop_front                 [6] pop_back     *\n");
		printf("*   [7] insert_pos                [8] insert_val   *\n");
		printf("*   [9] delete_pos                [10] delete_val  *\n");
		printf("*   [11] find                     [12] length      *\n");
		printf("*   [13] clear                    [14] destory     *\n");
		printf("*   [15] reverse(逆序)            [16] sort(顺序)  *\n");
		printf("****************************************************\n");
		printf("请选择:");
		scanf_s("%d", &select);
		switch (select)
		{
		case 1:
			show_list(&mylist);
			break;

		case 2:
			quit_system(&mylist, &select);
			break;

		case 3:
			printf("请输入要插入的值(-1结束):>");
			while (scanf_s("%d", &Item), Item != -1)
			{
				push_front(&mylist, Item);
			}
			break;

		case 4:
			printf("请输入要插入的值(-1结束):>");
			while (scanf_s("%d",&Item) , Item != -1)
			{
				push_back(&mylist, Item);
			}
			break;

		case 5:
			pop_front(&mylist);
			break;

		case 6:
			pop_back(&mylist);
			break;

		case 7:
			printf("请输入要插入的位置:");
			scanf_s("%d", &pos);
			printf("请输入要插入的值:");
			scanf_s("%d", &Item);
			insert_pos(&mylist, Item, pos);
			break;

		case 8:
			printf("请输入要插入的数:");
			scanf_s("%d", &Item);
			insert_val(&mylist, Item);
			break;

		case 9:
			printf("请输入要删的位置:");
			scanf_s("%d",&pos);
			delete_pos(&mylist,pos);
			break;

		case 10:
			printf("请输入要删的值:");
			scanf_s("%d", &Item);
			delete_val(&mylist,Item);
			break;

		case 11:
			printf("请输入要查找的数:");
			scanf_s("%d", &Item);
			pos=find(&mylist, Item);
			if (pos != -1)
			{
				printf("该数为第%d个数.\n", pos);
			}
			else
				printf("未找到该数。\n");
			break;

		case 12:
			printf("该顺序表长度为:%d\n",length(&mylist));
			break;

		case 13:
			clear(&mylist);
			break;

		case 14:
			destory(&mylist);
			break;

		case 15:
			reverse(&mylist);
			break;

		case 16:
			sort(&mylist);
			break;

		default:
			break;
		}
	}
}

时间: 2024-08-05 07:06:04

【数据结构】用C语言实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)的相关文章

【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #pragma once #include <iostream> using namespace std; template<class Type> class SeqList { public: SeqList(size_t sz = INIT_SIZE); ~SeqList(); public: bool isfull() const {return size >= capacity; } b

C语言实现顺序表

顺序表是C语言中一种基本的结构,可以存储各种基本类型的数据,而且不但可以存储基本类型的数据,也可以存储一种结构.所以顺序表是一种在学C的过程中必须掌握的结构,通过学习整理,下面来实现一下: 首先,先要想好用什么实现,一般实现最基本的顺序表的话直接用数组实现,我们在这用一个结构体来封装这个顺序表(封装这一概念是在C++中最常用的概念) #define ARRAY_EMPTY -2 #define ARRAY_FULL -1 #define MAX_SIZE 10000 typedef int Da

用C语言实现顺序表的插入和删除算法

什么是线性表? 线性表是n个数据元素的有限序列.根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的). 线性表如何用C语言实现?线性表可以进行哪些操作? 在C语言中,线性表通过结构体的方式来实现.结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量.操作包含在指定位置插入某一元素.删除指定元素.查找指定的元素等.在这里重点介绍插入和删除算法. 下面就是关于这一部分内容的陈述. 线性表的C语言实现 需要先定义好的

利用C语言实现顺序表

利用C语言实现静态顺序表 //---------- 头文件#include "SeqList.h" -------------------- #pragma once #include<stdio.h>#include<stdlib.h>#include<string.h> #define MAX 100 //------------------ 定义数据类型 ----------------------------typedef int DataT

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

数据结构(C实现)------- 顺序表

线性表是由n(n>=0)个具有相同数据类型的数据元素组成的有限序列,通常记为:(a1,a2,..,ai-1,ai,ai+1,...,an),表中相邻元素之间存在着序偶关系,即<ai-1,ai>,其中ai-1称为ai的前驱,ai称为ai-1的后继,2<=i<=n.表中数据元素的个数n,称为线性表的长度,长度为0的线性表称为空表.在非空的线性表中,每个数据元素都有一个确定的位置,如a1是第一个元素,an是最后一个元素,ai是第i个元素,称i 为数据元素ai在线性表上的位序. 顺序

基础数据结构-线性表-顺序表的合并操作

因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言. 顺序表的合并操作 题目描述建立顺序表的类,属性包括:数组.实际长度.最大长度(设定为1000) 已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序输入第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等 第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等输出顺序表内容包括顺序表的实际长度和数

C语言实现顺序表(数据结构线性表部分)

-------------------------------------------- 顺序表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 概念图 模块设计:伪代码写的非常差劲- -见谅 //初始化顺序表(InitList) 使用malloc函数

C语言实现顺序表的增删查改以及排序

顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,今天我用C语言实现下线性表的基本操作,以及冒泡排序与选择排序在线性表中的算法实践,代码如下: seqlist.h: #ifndef __SEQLIST__ #define __SEQLIST__ #define MAX 5 #include <stdlib.h> typedef int DataType; typedef struct SeqList { DataType array[MAX]; size_t size; }SeqLi