数据结构-顺序表实现

一、定义

1、顺序表特点

(1)顺序并且连续存储 ----->数组

(2)大小固定,表满不能存,表空不能取

(3)优点:查找相对方便    根据位置进行查找  pList->pData[pos]

(4)缺点:   添加,删除需要移动元素

二、嵌套Makefile实现顺序表

bin(可执行文件)、include(.h文件)、src(*.c文件)、obj(*.o文件)

1、.h头文件(list.h)

#ifndef _LIST_H
#define _LIST_H

typedef int data_type;

enum res
{
	EMPTY=-3,
	FULL,
	POSERR,
	LISTNULL,//顺序表为空
	OK
};

typedef struct list
{
	data_type * pData;//保存数据的首地址
	int size;//保存数据元素的最大个数
	int count;//保存顺序表中有多少个有效数据 count==0 表空 count==size 表满
}List;

List * createList(int size);//创建顺序表
int insertList(List * pList,int pos,data_type item);//添加顺序表
int showList(List * pList);//显示顺序表
int deleteList(List * pList,int pos,data_type * pItem);//删除顺序表中的元素
int destroyList(List **ppList);//释放顺序表

void menu(void);

#endif

2、src(*.c文件) 

list.c程序代码

#include <stdio.h>
#include "../include/list.h"
#include <stdlib.h>
#include <string.h>

List * createList(int size)//创建顺序表    参数:顺序表大小  返回值顺序表的首地址
{
	//动态分配顺序表   大小  sizeof(List)
	List * pList=NULL;
	pList=(List *)malloc(sizeof(List));
	if(NULL==pList)
	{
		perror("malloc error");
		return NULL;
	}

	memset(pList,'\0',sizeof(List));
//动态分配size个存储数据元素(data_type)的空间
	pList->pData=(data_type *)malloc(sizeof(data_type)*size);
	if(NULL==pList->pData)
	{
		perror("malloc error");
		return NULL;
	}
	pList->size=size;
	return pList;
}

//添加宾插入元素
int insertList(List * pList,int pos,data_type item)
{
	if(NULL==pList)//入参 判断顺序表是否为空
	{
		return LISTNULL;
	}
	if(pos<0 || pos>pList->count)//插入位置是否正确
	{
		return POSERR;
	}
	if(pList->count==pList->size)//顺序表是否为满
	{
		return FULL;
	}
	//根据位置进行插入
	int i=0;
	for(i=pList->count-1;i>=pos;i--)//从count-1开始到pos开始依次移动一位
	{
		pList->pData[i+1]=pList->pData[i];
	}
	pList->pData[pos]=item;//将新加的元素放入到插入的位置
	pList->count++;//给count自增
	return OK;	
}

//显示顺序表
int showList(List * pList)
{
	if(NULL==pList)
	{
		return LISTNULL;
	}
	int i=0;
	for(i=0;i<pList->count;i++)
	{
		printf("%5d",pList->pData[i]);
	}
	printf("\n");

}

//删除顺序表中的元素,并保存删除的元素
int deleteList(List * pList,int pos,data_type * pItem)
{
	//入参判断
	if(NULL==pList)//判断顺序表是否为空
	{
		return LISTNULL;
	}
	if(pos<0||pos>pList->count-1)//判断顺序表的位置是否正确
	{
		return POSERR;
	}
	if(0==pList->count)//顺序表是否为空
	{
		return EMPTY;//顺序表中无有效数据
	}
	*pItem=pList->pData[pos];//将删除的数据保存下来
	//从pos+1到count-1开始依次向前移动一位
	int i=0;
	for(i=pos+1;i<=pList->count-1;i++)
	{
		pList->pData[i-1]=pList->pData[i];
	}
	pList->count--;
	return OK;
}
//销毁顺序表
int destroyList(List ** ppList)//ppList=&pList  pList=*ppList
{
	if(NULL==*ppList) return LISTNULL;
	free((*ppList)->pData);//先释放存储数据元素的空间
	free(*ppList);//释放顺序表的空间
	*ppList=NULL;
	return OK;
}

菜单显示代码(menu.c)

#include <stdio.h>

void menu(void)
{
	printf("1---------insert\n");
	printf("2---------show\n");
	printf("3---------delete\n");
	printf("4---------destroy\n");
	
}

测试代码(test.c)

#include <stdio.h>
#include "../include/list.h"

int main(void)
{
	List * pList=NULL;
	int size=0;
	int pos=0;
	int op=0;
	data_type item;

	printf("请输入你要创建的元素\n");
	scanf("%d",&size);
	pList=createList(size);//创建顺序表
	while(1)
	{
		menu();
		printf("请输入选项\n");
		scanf("%d",&op);
		if(-1==op) break;
		switch(op)
		{
			case 1:
				printf("请输入你要插入的位置和元素\n");
				scanf("%d%d",&pos,&item);
				insertList(pList,pos,item);
				break;
			case 2:
				showList(pList);
				break;
			case 3:
				printf("请输入你要删除的位置\n");
				scanf("%d",&pos);
				deleteList(pList,pos,&item);
				printf("del %d\n",item);
				break;
			case 4:
				printf("%p\n",pList);
				destroyList(&pList);
				printf("%p\n",pList);
		}
	}
	return 0;
}

3、嵌套Makefile

(1)编写总控Makefile(制定执行规则)

(2)进入src编写Makefile(将所有的.c文件生成.o文件并移动到obj目录中)

(3)进入obj编写Makefile(将所有的.o文件生成了可执行文件并移动到bin目录中)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值