数据结构之顺序表。

今天我们来学习一下顺序表的各种算法,希望大家能认真练习。

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<Windows.h>
typedef int DataType;
#define MAX_SIZE (100)  
typedef struct SeqList{
	DataType array[MAX_SIZE];   //存数据的空间
	int size;                   //有效数据有多少个,当前可用的数组下标。
}SeqList;
//初始化
void SeqListinit(SeqList *pSL)
{
	assert(pSL!=NULL);             //断言pSL不为空。
	pSL->size=0;                   //将结构体初始为0.
}


//销毁
void SeqListDestroy(SeqList *pSL)
{
	assert(pSL!=NULL);
	pSL->size=0;
}



//增删改查
//增
//尾插
void SeqListPushBack(SeqList *pSL,DataType data)
{
	assert(pSL!=NULL);
	assert(pSL->size>0);                      //断言。
	pSL->array[pSL->size++]=data;             //直接将最后一个的后面的位置附上data,在给总长度加1.

}

// 头插
void SeqListPushFront(SeqList *pSL, DataType data)
{
	int n=pSL->size;           //定义一个变量n为有效数据个数。
	assert(pSL!=NULL);
	assert(pSL->size>0);
	while(n>0)
	{
		pSL->array[n]=pSL->array[n-1];      //通过循环将所有值往后移一位。
		n--;
	}
	pSL->array[n]=data;                     //再给第一个赋值data.
	pSL->size++;                            //总长度加1.
}

// 根据下标插入
void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
	int x=0;
	int i=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	assert(pos>=0&&pos<=pSL->size);
	for(x=pSL->size-1;x>=pos;x--)                      //循环将下标以及之后的值全部向后移一位。
	{
		pSL->array[x+1]=pSL->array[x];
	}
	pSL->array[pos]=data;                              //再给pos位赋值data。
	pSL->size++;
}


//尾删
void SeqListPopBack(SeqList *pSL)
{
	assert(pSL!=NULL);
	assert(pSL->size>0);
	pSL->size--;                  //直接长度减一即可尾删成功。
}
//头删
void SeqListPopFront(SeqList *pSL)
{
	int p=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	for(p=0;p<pSL->size-1;p++)
	{
		pSL->array[p]=pSL->array[p+1];             //从前往后的的将值往前移一位。
	}
	pSL->size--;                                   //总长度减一。
}
//根据下标删除
void SeqListErase(SeqList *pSL,int pos)
{
	int q;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	for(q=pos;q<pSL->size-1;q++)                   //将下标以及之后的值向前移一位。
	{
		pSL->array[q]=pSL->array[q+1];
	}
	pSL->size--;                                   //总长度减一。
}


// 查询
// 返回遇到的第一个下标,如果没有遇到,返回 -1
int SeqListFind(SeqList *pSL, DataType data)
{

	int i=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	for(i=0;i<pSL->size;i++)
	{
		if(pSL->array[i]==data)         //如果相等,返回该下标,否则输出-1.
		{
			return i;
		}
	}
	return -1;
}
//根据数据删除,只删除遇到的第一个。
void SeqListRemove(SeqList *pSL,DataType data)
{ 
	int m=data;
	int i=0;
	int ret=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	ret=SeqListFind(pSL,m);
	if(ret==-1)
	{
		printf("It has not this number!\n");      //如果ret=-1,则没有这个数,否则将这个数的下一个数赋给它。
	}
	else
	{
		while(i<pSL->size-1){
		pSL->array[i]=pSL->array[i+1];
		i++;
		}
	}
	pSL->size--;                                    //最后长度减一。
}

// 根据数据删除,删除所有遇到的
void SeqListRemoveAll(SeqList *pSL, DataType data)
{
	int i=0;
	int j=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	for(i=0;i<pSL->size;i++)
	{
		if(pSL->array[i]!=data)
		{
			pSL->array[j]=pSL->array[i];           
			j++;
		}
	}
	pSL->size=j;
}

// 根据下标更新
void SeqListUpdate(SeqList *pSL, int pos, DataType data)
{
	int e=pos;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	pSL->array[e]=data;

}


// 判断是否为空,1 表示空, 0 表示不空 
int SeqListEmpty(SeqList *pSL)
{
	if(pSL->size==0)   //如果有效数据为0,表示为空。
	{
		return 1;
	}
	return 0;
}

// 返回数量 
int SeqListSize(SeqList *pSL)
{
	int count=0;
	assert(pSL!=NULL);
	assert(pSL->size>0);
	count=pSL->size;
	printf("%d\n",count);
	return 0;
}
这就是顺序表的静态情况。动态与它十分类似,大家自己模仿着练习一下就行了。

猜你喜欢

转载自blog.csdn.net/ymk1507050118/article/details/80663955
今日推荐