顺序表的有关增强练习

/*
	Name: SeqList_Rel
	Copyright:
	Author: huowolf
	Date: 06/07/15 21:49
	Description: 顺序表的有关增强练习
*/

#include <iostream>
using namespace std;
#define MAXSIZE 100

typedef int ElemType;
struct SeqList
{
	ElemType elems[MAXSIZE];
    int last;
};

void InitList(SeqList &l);
int InsertList(SeqList &l,int i,ElemType e);
void CreateList(SeqList &l);
void Output(SeqList &l);
void OrderInsert(SeqList &l,ElemType x);
void MultyDelete(SeqList &l,int i,int k);
void Delsame(SeqList &L);
void Invert(SeqList &L);

SeqList L;
int main()
{

	InitList(L);
	CreateList(L);
	Output(L);
	/*
	int x;
	cout<<"请输入一个你要有序插入的元素:";
	cin>>x;
	OrderInsert(L,x);
	Output(L);

	int a,b;
	cout<<"请输入你要開始删除的位置i,以及要删除的个数k:";
	cin>>a>>b;
	MultyDelete(L,a,b);
	Output(L);

    int item;
    cout<<"请输入你要删除的元素";
    cin>>item;
    DeleteItem(L,item);
    Output(L);

    Delsame(L);
    Output(L);
    */
    Invert(L);
    Output(L);
	return 0;
}

void InitList(SeqList &l)
{
    l.last = -1;
}

int InsertList(SeqList &l,int i,ElemType e)		//1<=i<=L->last+2
 {
    if(i<1 || i>l.last+2)
    {
        cout<<"插入位置i非法。"<<endl;
        return -1;
    }
    if(i>MAXSIZE-1)
    {
        cout<<"表已满,无法插入。"<<endl;
        return -1;
    }
	for(int j=l.last+1;j>=i;j--)
		l.elems[j]=l.elems[j-1]; 

    l.elems[i-1] = e;	//插入 (第i个元素的下标是i-1)
    l.last++;
    return 0;
}

void CreateList(SeqList &l)
{
    cout<<"请依次输入数据,并以-1作为结束标记:"<<endl;
    int n;
    cin>>n;
    while(n!=-1)
    {
        InsertList(l,l.last+2,n);
        cin>>n;
    }
}

void Output(SeqList &l)
{
	cout<<"遍历该顺序表例如以下:"<<endl;
    for(int i=0;i<=l.last;i++)
    {
        cout<<l.elems[i]<<" ";
    }
    cout<<endl;
}

/*
该函数实现下面功能:
已知顺序表L单调递增。将X插入线性表的适当位置
以保持线性表的有序性。

*/
void OrderInsert(SeqList &l,ElemType x)
{
	int i=l.last;
	while(i>=0&&x<l.elems[i])
	{
		l.elems[i+1]=l.elems[i];
	 	i--;
	}
	l.elems[i+1]=x;
	l.last++;
}

/*
从顺序表中删除自第i个元素開始的k个元素
*/
void MultyDelete(SeqList &l,int i,int k)
{
	if(l.last+1-i+1<k)
		cout<<"參数有误。你要删除的区间元素不足"<<k<<"个"<<endl;
	int m,j;
	for(m=i-1,j=k+i-1;j<=l.last;j++)
		l.elems[m++]=l.elems[j];
	l.last=m-1;
} 

/*
编写一时间复杂度为O(n),空间复杂度为O(1)的算法。
删除线性表中所以值为item的元素
*/
void DeleteItem(SeqList &l,ElemType item)
{
	int i=0,k=0;
	while(i<=l.last)
	{
		if(l.elems[i]!=item) l.elems[k++]=l.elems[i];
		i++;
	}
	l.last=k-1;
}  

/*
编写一时间复杂度为O(n^2),空间复杂度为O(1)的算法。
删除所以值相等的多余元素
*/
void Delsame(SeqList &L)
{

	int i=0,k;
	for(int j=1;j<=L.last;j++)
	{
		//假设当前元素L.elems[j]和L.elems[0...i]中的某一元素相等,就break
		for(k=0;k<=i;k++)if(L.elems[k]==L.elems[j])break;
		//假设上面运行了break,也就是有同样元素..那么则有k<=i
		//假设没有运行break..则一定有k>i
		if(k>i)L.elems[++i]=L.elems[j];//把当前元素L.elems[j]追加到以完毕的有序区中
	}
	L.last = i;
}

//实现顺序表的就地逆置算法
void Invert(SeqList &L)
{
	int i,j,t;
	i=0;j=L.last;
	while(i<j)
	{
		t=L.elems[i]; L.elems[i]=L.elems[j]; L.elems[j]=t;
		i++;j--;
	}
}
时间: 2024-10-08 04:33:47

顺序表的有关增强练习的相关文章

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

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

顺序表算法设计笔记

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 的空间.

2、顺序表

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 从这节开始,以后的每一篇博文均会只描述一种结构.这节要解决的是有关顺序表的问题,下面就是一些顺序表的基本的知识点: 1. 顺序表其实就是线性表的一种,它除开始节点和结束节点之外的其他节点,均有且只有一个直接前趋和一个直接后继,开始 节点只有一个后继节点,结束节点只有一个前趋节点. 2. 用顺序存储方法存储的线性表就称为顺序表. 3. 顺序存储方法就是将表的节点按逻辑上的次序依次的存放在一组连续的内存单元中,这里是指在逻辑上连续排列,在

顺序表查找和有序表查找

查找里面顺比表查找和有序表查找(包括二分查找,插值查找,斐波那契查找)比较简单,直接贴代码,代码里面有详细注释. 1 #include <iostream> 2 using namespace std; 3 4 //顺序表查找(线性查找.静态表查找) 时间复杂度为O(n) 5 int Seq_Search(int *s,int n,int key) 6 { 7 s[0] = key; //设置了一个哨兵,避免了每次比较一次过后都要判断查找位置是否越界 8 int i = n; 9 while

线性表---顺序表

线性结构的特点是:在非空的有限集合中,只有唯一的第一个元素和唯一的最后一个元素.第一个元素没有直接前驱元素,最后一个没有直接的后继元素.其它元素都有唯一的前驱元素和唯一的后继元素. 线性表是一种最简单的线性结构.线性表可以用顺序存储结构和链式存储结构存储,可以在线性表的任意位置进行插入和输出操作. 要想将线性表在计算机上实现,必须把其逻辑结构转化为计算机可识别的存储结构.线性表的存储结构主要有两种:顺序存储结构和链式存储结构. 线性表的顺序表示与实现 线性表的顺序存储结构 线性表的顺序存储结构指

模板实现顺序表

类模板的成员函数: 类模板的成员函数本身是一个普通函数.但是,类模板的每个实例都有其自己版本的成员函数.因此,类模板的成员函数具有和模板相同的模板参数.因此,在=定义在类模板之外的成员函数就必须以template开始,后跟类模板参数列表. 类模板中的友元函数: 类模板中的友元函数,应该在类中定义.若只在类中声明,在类外定义,则在链接时会出现错误. 类模板实现顺序表: "SeqList.h" //冒泡法 "test.cpp"

顺序表

#include <cstdio> #include <cstring> ///都用c语言写的 #include <iostream> ///建议从主函数开始看 #include <cstdlib> using namespace std; int sequence_map[1000]; int total_sequence = 0; void init_sequence() ///主界面. ///一级菜单中顺序表的操作界面 init初始化 { printf

顺序表的非递减数列合并

#include<stdio.h> /*包含输入输出头文件*/ #define ListSize 100 typedef int DataType; typedef struct { DataType list[ListSize]; int length; }SeqList; void InitList(SeqList *L) /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/ { L->length=0; /*把线性表的长度置为0*/ } int ListEmpt

顺序表(存在问题)

#include <iostream> using namespace std; typedef int DataType; struct SeqList { int MAXNUM; int n; DataType *element; }; typedef struct SeqList *PSeqList; PSeqList createEmptySeq(int m) { PSeqList palist = (PSeqList) malloc (sizeof (struct SeqList))