顺序表基本算法

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

#define MAX 100
typedef int DataType;

typedef struct Seqlist
{
	DataType Data[MAX];
	DataType sz;
}Seqlist ,*pSeqlist;

void PrintSeqlist(pSeqlist pSeq);                      //打印顺序表
void InitSeqlist(pSeqlist pSeq);                       //初始化顺序表
void PushBack(pSeqlist pSeq, DataType x);              //从后面插入一个元素
void Popback(pSeqlist pSeq);                           //抛出最后面的
void PushFornt(pSeqlist pSeq,DataType x);              //在头部插入一个元素
void PopFornt(pSeqlist pSeq);                          //删除头元素
void Insert(pSeqlist pSeq,int pos, DataType x);        //指定位置插入
void Remove(pSeqlist pSeq, DataType x);                //移除第一个出现的x
void RemoveAll(pSeqlist pSeq, DataType x);             //移除全部的x
void Sort(pSeqlist pSeq);                              //排序顺序表
int BinarySearch(pSeqlist pSeq,DataType x);            //二分查找,返回元素所在下标

#endif         //__SEQLIST_H__

#include"seqlist.h"

void PrintSeqlist(pSeqlist pSeq)
{
	assert(pSeq);
	int i = 0;
	if (pSeq->sz == 0)                                 //异常情况,表为空
	{
		printf("表是空表\n");
	}
	else
	{
		for (i = 0; i < pSeq->sz; i++)
		{
			printf("%d  ",pSeq->Data[i]);
		}
		printf("\n");
	}
}

void InitSeqlist(pSeqlist pSeq)
{
	assert(pSeq);
	pSeq->sz = 0;
}

void PushBack(pSeqlist pSeq, DataType x)
{
	assert(pSeq);
	if (pSeq->sz == MAX)                                        //异常情况,表为满
	{
		printf("表已满\n");
		return;
	}
	pSeq->Data[pSeq->sz] = x;
	pSeq->sz++;
}

void Popback(pSeqlist pSeq)
{
	assert(pSeq);
	if (pSeq->sz == 0)                                           //异常情况,表为空
	{
		printf("表已空\n");
		return;
	}
	pSeq->sz--;
}

void PushFornt(pSeqlist pSeq, DataType x)
{
	assert(pSeq);
	int i=0;
	if (pSeq->sz == MAX)                                              //异常情况,表为满
	{
		printf("表已满\n");
		return;
	}
	for (i = pSeq->sz; i > 0; i--)
	{
		pSeq->Data[i] = pSeq->Data[i - 1];
	}
	pSeq->Data[0] = x;
	pSeq->sz++;
}

void PopFornt(pSeqlist pSeq)
{
	assert(pSeq);
	int i = 0;
	if (pSeq->sz ==0)                                                   //异常情况,表为空
	{
		printf("表已空\n");
		return;
	}
	for (i = 0; i< pSeq->sz-1; i++)
	{
		pSeq->Data[i] = pSeq->Data[i+1];
	}
	pSeq->sz--;
}

void Insert(pSeqlist pSeq, int pos, DataType x)
{
	assert(pSeq);
	int i = 0;
	if (pSeq->sz == MAX)                                   //异常情况,表为满
	{
		printf("表已满\n");
		return;
	}
	if (pos > pSeq->sz&&pos<0)                           //插入位置小于0或者大于sz都是不合法,顺序表要求位置连续
	{
		printf("插入位置不合法\n");
		return;
	}
	for (i = pSeq->sz;i>pos; i--)
	{
		pSeq->Data[i] = pSeq->Data[i - 1];
	}
	pSeq->Data[pos] = x;
	pSeq->sz++;
}

void Remove(pSeqlist pSeq, DataType x)
{
	assert(pSeq);
	int i = 0;
	if (pSeq->sz == 0)                                             //异常情况,表为空
	{
		printf("表已空\n");
		return;
	}
	while (i<pSeq->sz)
	{
		if (pSeq->Data[i] == x)
		{
			for (; i< pSeq->sz - 1; i++)
			{
				pSeq->Data[i] = pSeq->Data[i + 1];
			}
			pSeq->sz--;
			break;
		}
		i++;
	}
}

void RemoveAll(pSeqlist pSeq, DataType x)
{
	assert(pSeq);
	int i = 0;
	int j = 0;
	if (pSeq->sz == 0)                                                  //异常情况,表为空
	{
		printf("表已空\n");
		return;
	}
	while (i<=pSeq->sz)
	{
		if (pSeq->Data[i] == x)
		{
			for (j=i; j< pSeq->sz - 1; j++)
			{
				pSeq->Data[j] = pSeq->Data[j + 1];
			}
			pSeq->sz--;
		}
		i++;
	}
}

void Sort(pSeqlist pSeq)
{
	assert(pSeq);
	if (pSeq->sz == 0)                                                    //异常情况,表为空
	{
		printf("表已空\n");
		return;
	}
	int i = 0;
	int j = 0;
	int flag = 0;
	for (i = 0; i < pSeq->sz - 1;i++)
	{
		flag = 0;
		for (j = 0; j < pSeq->sz - i - 1; j++)
		{
			if (pSeq->Data[j]>pSeq->Data[j + 1])
			{
				DataType tmp = pSeq->Data[j];
				pSeq->Data[j] = pSeq->Data[j+1];
				pSeq->Data[j+1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}

int BinarySearch(pSeqlist pSeq, DataType x)
{
	assert(pSeq);
	if (pSeq->sz == 0)                                                //异常情况,表为空
	{
		printf("表已空\n");
		return -1;
	}
	int left = 0;
	int right = pSeq->sz-1;
	int mid = (left&right) + ((left^right)>>1);                       //mid取平均值
	while (left<right)
	{
		if (x>pSeq->Data[mid])
		{
			left = mid + 1;
			mid = (left&right) + ((left^right) >> 1);
		}
		else if (x<pSeq->Data[mid])
		{
			right = mid -1;
			mid = (left&right) + ((left^right) >> 1);
		}
		else
		{
			printf("%d\n",mid);
			return mid;                                                        //返回这个元素所在的下标
		}
	}
	return -1;
}

#include"seqlist.h"

void menu()
{
	printf("*********************************\n");
	printf("0.exit            1.PrintSeqlist \n");
	printf("2.InitSeqlist     3.PushBack     \n");
	printf("4.Popback         5.PushFornt    \n");
	printf("6.PopFornt        7.Insert       \n");
	printf("8.Remove          9.RemoveAll    \n");
	printf("10.Sort           11.BinarySearch\n");
	printf("请输入:>");
}

void test(pSeqlist pSeq)
{
	DataType x = 0;
	int n = 0;
	int pos = 0;
	while (1)
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			exit(1);
			break;
		case 1:
			PrintSeqlist(pSeq);
			break;
		case 2:
			InitSeqlist(pSeq);
			break;
		case 3:
			printf("请输入元素\n");
			scanf("%d", &x);
			PushBack(pSeq, x);
			break;
		case 4:
			Popback(pSeq);
			break;
		case 5:
			printf("请输入元素\n");
			scanf("%d", &x);
			PushFornt(pSeq, x);
			break;
		case 6:
			PopFornt(pSeq);
			break;
		case 7:
			printf("请输入元素\n");
			scanf("%d", &x);
			printf("请输入插入位置\n");
			scanf("%d", &pos);
			Insert(pSeq, pos, x);
			break;
		case 8:
			printf("请输入元素\n");
			scanf("%d", &x);
			Remove(pSeq, x);
			break;
		case 9:
			printf("请输入元素\n");
			scanf("%d", &x);
			RemoveAll(pSeq, x);
			break;
		case 10:
			Sort(pSeq);
			break;
		case 11:
			printf("请输入元素\n");
			scanf("%d", &x);
			BinarySearch(pSeq, x);
			break;
		default:
			printf("输入无效\n");
			break;
		}
	}
}

int main()
{
	Seqlist pSeq;
	memset(pSeq.Data, 0, sizeof(DataType)*MAX);
	pSeq.sz = 0;
	test(&pSeq);
	system("pause");
	return 0;
}

时间: 2024-10-06 13:42:11

顺序表基本算法的相关文章

顺序表查找算法及其优化

顺序查找算法实现如下: var arr = [5, 2, 4, 3, 1] , sequentialSearch = function(arr, val) { var i = 0 , len = arr.length; for ( ; i < len; i++) { // 比较一次 if (arr[i] === val) { // 比较二次 return i; } } return i; // 返回len,则说明查找失败 } 这里并不是足够完美, 因为每次循环时都需要对i是否越界, 即是否小于l

顺序表的算法

顺序表 要点 顺序表是在计算机内存中以数组的形式保存的线性表,是指使用一组地址连续的存储单元依次存储数据元素的线性结构. 顺序表的存储结构可表示如下: #define MAXSIZE 10 typedef int ElemType; typedef struct { // 顺序表的结构类型 ElemType data[MAXSIZE]; int length; } SqList; 基本操作 插入数据元素 在顺序表的第 pos(0≤pos≤length) 个位置上插入新的元素e. 如果 pos 值

SDUT 3327 顺序表应用4:元素位置互换之逆置算法

顺序表应用4:元素位置互换之逆置算法 Time Limit: 10 ms Memory Limit: 570 KiB Problem Description 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N).空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段.注意:先将顺序

顺序表插入、删除算法用C语言来实现

#include<stdio.h> #include<stdlib.h> //-------- 线性表的动态分配顺序存储结构 ----------- int LIST_INIT_SIZE=100;   //顺序表存储空间初始尺寸 int LISTINCREMENT=10;  //顺序表存储空间分配增量 typedef  int  ElemType;          //顺序表元素的数据类型为整数 //存储结构定义:顺序表 typedef struct { ElemType *el

顺序表编程考点

1.顺序表删除算法 //顺序表删除算法 typedef struct{ Elemtype *elem; int length; int listsize; }Sqlist; int ListDelete_sq(Sqlist *L,int i) //删除顺序表L中的第i个元素 { int k; if(i<1 || i>L->length) //删除位置出错 return 0; for(k = i;k< L->length; k++) //从第i+1个位置开始,每个元素前移一个位

&quot;数据结构翻转课堂&quot;答疑实录——顺序表

[说明] 本文是<数据结构>翻转课堂在线答疑的实录,由云班课的"答疑/讨论"功能中导出数据整理而成.. [重要提示] 下面的内容,按时间从后往前的顺序提供,请直接到文章末尾,倒着看更顺畅. [课程实践答疑实录] 焦梦真2015-09-20 11:19:20说 太难了 贺利坚2015-09-20 11:25:48答 练就将军本色之时到了.待回头看,江山本是如此多娇! 高露2015-09-19 15:14:50 用指针和线性表那一块... 王增亮2015-09-15 21:18

数据结构实践项目——顺序表

[项目1 - 顺序表的基本运算] 领会"0207将算法变程序"部分建议的方法,将顺序表部分的算法变成程序. 实现顺序表基本运算有算法(对应视频0204创建线性表的实现和0205顺序表基本运算的实现),依据"最小化"的原则进行测试.所谓最小化原则,指的是利用尽可能少的基本运算,组成一个程序,并设计main函数完成测试. 作为第一个这种类型的实践(后续每一部分均有这种实践,这是我们学习的基础,也是实践成果积累的基础),结合相关的算法,给出建议的过程: (1)目的是要测试

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

顺序表算法设计笔记

1.已知长度为 n 的线性表 A 采用顺序存储结构.设计一个时间复杂度为O(n).空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素. 以下两种方法都不满足要求: 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1). 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n). 解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间.