一、定义
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目录中)