顺序表的理解和基本操作

 线性表:是最常用和最简单的一种数据结构。一个线性表是n个数据元素的有限序列(这个数据元素可以是一个数或者一个符号)可以在他的任意位置进行插入和删除操作。

从数据在屋里内存存储形式上线性表有两种:

                      1.顺序表
 
                       2.链表
   从上图可知:
 线性表中数据与数据之间存在一一对应的关系,即除第一个元素和最后一个元素之外,每个元素都有直接的前驱和唯一的直接后驱,第一个元素没有前驱,最后一个元素没有后驱。
       
                                       顺序表
  顺序表:是用一组地址连续的存储单元一次存储线性表的数据元素 (地址连续的空间,一般情况下采用数组,但数组有静态数组和动态数组所以顺序表有静态和动态之分)
    特点:表中相邻的两个元素a(i)和a(i+1)赋以相邻的存储位置。顺序表的存储结构是一种随机存储结构。
                                                     顺序表的存储结构示意图
代码部分:
代码的功能:

1.初始化顺序表
2.尾插/尾删

3.头插/头删
4.任意位置插入/任意位置删除
5. 删除指定元素
6.删除全部指定的元素
7.打印顺序表


动态顺序表实现代码: 点击打开链接

Seqlist.h
                             
#pragma once
#include<stdio.h>
#include<assert.h>
#include<Windows.h>

#define MAX_SIZE 10
typedef int DataType;
typedef  struct Seqlist
{
	DataType _array[MAX_SIZE];
	int _size;

}Seqlist;


void SeqlistInit( Seqlist *ps);     //初始化链表
void Seqlistpushback( Seqlist *ps, DataType data);    //尾插
void Seqlistpopback(Seqlist *ps);                           //尾删
void Seqlistpushfront(Seqlist *ps, DataType data);          //头插
void Seqlistpopfront(Seqlist *ps);                          //头删
void Seqlistpushinsert(Seqlist *ps, int pos, DataType data); //任意位置插入一个数
void Seqlistpopinsert(Seqlist *ps, int pos);                  //任意位置删去一个数
void Seqlistremove(Seqlist *ps, int data);                   //删去某一个数据
void Seqlistremoveall(Seqlist *ps, int data);                //删去一个数据的所有值
void PrintSeqlist(Seqlist *ps);                              //打印顺序表

Seqlist.c

//找指定数据
int FindNum(Seqlist *ps, DataType data)
{
	if (NULL == ps)
		return 0;
	for (int i = 0; i < ps->_size; ++i)
	{
		if (data == ps->_array[i])
			return i;
	}
	return -1;

}

//初始化顺序表
void SeqlistInit(Seqlist *ps)
{
	
	ps->_size = 0;
}

//尾插
void Seqlistpushback(Seqlist *ps, DataType data)
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	if (MAX_SIZE == ps->_size)
	{
		printf("链表空间不足!!\n");
		return;
	}
	ps->_array[ps->_size] = data;
	ps->_size++;
}

//尾删
void Seqlistpopback(Seqlist *ps)                          //尾删
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}

	ps->_size--;
}

//头插
void Seqlistpushfront(Seqlist *ps, DataType data)
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	if (MAX_SIZE == ps->_size)
	{
		printf("链表空间不足!!\n");
		return;
	}
	int i = ps->_size;

	for (; i>0; i--)
	{
		ps->_array[i ] = ps->_array[i-1];
	}
     
	ps->_array[0] = data;
	ps->_size++;

}

//头删
void Seqlistpopfront(Seqlist *ps)                          
{
	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	
	int i = 0;
	for (; i < ps->_size - 1; i++)
	{
		ps->_array[i] = ps->_array[i + 1];
	}
	--ps->_size;
}

//任意位置插入一个数
void Seqlistpushinsert(Seqlist *ps, int pos, DataType data)
{
	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	if (MAX_SIZE == ps->_size)
	{
		printf("链表空间不足!!\n");
		return;
	}
	int i = ps->_size;
	for (; i > pos; i--)
	{

		ps->_array[i + 1] = ps->_array[i];
	}
	++ps->_size;
	ps->_array[pos] = data;

}

//任意位置删去一个数
void Seqlistpopinsert(Seqlist *ps, int pos)
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	if (MAX_SIZE == ps->_size)
	{
		printf("链表空间不足!!\n");
		return;
	}
	int i = pos;
	for (; i > ps->_size - 1; ++i)
	{
		ps->_array[i] = ps->_array[i + 1];
	}
	--ps->_size;
}

//删去某一个数据
void Seqlistremove(Seqlist *ps, int data)
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	int ret = FindNum(ps,data);
	if (data == -1)
	{
		printf("未找到\n");
		return;
	}
	int i = ret;
	for (; i > ps->_size - 1; ++i)
	{
		ps->_array[i] = ps->_array[i + 1];
	}
	--ps->_size;
}

//删除所有的选定数据
void Seqlistremoveall(Seqlist *ps, int data)   
{

	if (NULL == ps)
	{
		printf("链表为空!!!\n");
		return;
	}
	int ret = FindNum(ps,data);
	int count = 0;
	int i = 0;
	if (ret == -1)
	{
		printf("未找到");
		return;
	}

	for (; i > ps->_size - 1; ++i)
	{
		if (data == ps->_array[i])
			count++;
		else
			ps->_array[i - count] = ps->_array[i];//朝前搬移count位


	}

	ps->_size -= count;

}


//打印链表
void PrintSeqlist(Seqlist *ps)
{
	assert(ps);
	if (NULL == ps)
		return;
	int i = 0;
	for (; i < ps->_size ; i++)
	{
		printf("%d-->", ps->_array[i]);

	}

	printf("\n");
}

test.c

void ListTest()
{
	Seqlist ps;

	SeqlistInit(&ps);
	Seqlistpushback(&ps, 1);
	Seqlistpushback(&ps, 2);
	Seqlistpushback(&ps, 3);
	Seqlistpushback(&ps, 4);
	PrintSeqlist(&ps);

	Seqlistpopback(&ps);
	PrintSeqlist(&ps);

	Seqlistpushfront(&ps, 5);
	Seqlistpushfront(&ps, 6);
	PrintSeqlist(&ps);

	Seqlistpopfront(&ps);
	PrintSeqlist(&ps);

	Seqlistpushinsert(&ps, 2, 7);
	PrintSeqlist(&ps);

	Seqlistpopinsert(&ps, 3);
	PrintSeqlist(&ps);

	Seqlistremove(&ps, 5);
	PrintSeqlist(&ps);

	Seqlistremoveall(&ps, 4);
	PrintSeqlist(&ps);
}
int main()
{

	ListTest();
	system("pause");
	return 0;

}

                       

猜你喜欢

转载自blog.csdn.net/alidada_blog/article/details/80408999