一。建立status.h头文件
#ifndef STATUS_H //防止头文件的重复包含和编译(if not difine,如果不存在)
#define STATUS_H //就引入STATUS_H
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int ElemType;
#endif
二、建立’Sqlish.h文件
#ifndef SQLIST_H
#define SQLIST_H
#include <stdio.h>
#include "status.h"
//线性表的动态分布顺序存储结构
#define LIST_INIT_SIZE 100 //初始化表的存储空间
#define LISTINCREMENT 10 //分配存储空间的增量
typedef struct{
ElemType *elem; //数组指针elem指示表的基地址
int length;
int listsize; //当前容量
}SqList;
Status InitList (SqList *L);
int ListLength(SqList L);
int IsEmpty(SqList L);
int GetElem(SqList L,int i,ElemType *e);
Status ListInsert(SqList *L,int i,ElemType e);
void ListTraverse(SqList L);
void MergeList(SqList La,SqList Lb,SqList *Lc);
Status ListDelete(SqList *L,int i,ElemType *e);
void ClearList(SqList *L);
void DestroyList(SqList *L);
#endif
`
三。建立Sqlish.c文件,里边是具体方法
#include <stdio.h>
#include "Sqlist.h"
Status InitList(SqList *L){//建立一个空表,顺序表的初始化
(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType))://动态分配空间
if(!(*L).elem) exit(OVERFLOW);
(*L).length=0;
(*L).listsize=LIST_INIT_SIZE;
return OK;
}
int ListLength(SqList L){
return (L.length);
}
int IsEmpty(SqList L){
return (L.length==0? TRUE:FALSE);
}
int GetElem(SqList L,int i,ElemType *e){
if(i<1||i>L.length) return ERROR;//判断是否合理
*e=L.elem[i-1];//数组中第i-1的单元存储线性表中第i个数据元素的内容
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
ElemType *newbase,*q,*p;
if(i<1||i>(*L).length+1) /* i值不合法 */
return ERROR;
if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配 */
{
newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW); /* 存储分配失败 */
(*L).elem=newbase; /* 新基址 */
(*L).listsize+=LISTINCREMENT; /* 增加存储容量 */
}
q=(*L).elem+i-1; /* q为插入位置 */
for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */
*(p+1)=*p;
*q=e; /* 插入e */
++(*L).length; /* 表长增1 */
return OK;
}
void ListTraverse(SqList L){//遍历
int i;
for(i=0;i<L.length;i++){
printf("%d,",L.elem[i]);
}
printf("\n");
}
void MergeList(SqList La,SqList Lb,SqList *Lc){//顺序表的合并
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;pb=Lb.elem;
Lc->listsize=Lc->length=La.length+Lb.length;
pc=Lc->elem=(ElemType *)malloc(Lc->listsize*sizeof(ElemType));//开辟空间
if(!Lc->elem)exit(OVERFLOW);//存储失败
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last){//递归合并
if(*pa<=*pb){
*pc++=*pa++;
}else{
*pc++=*pb++;
}
}
while(pa<=pa_last)*pc++=*pa++;//插入la的剩余元素
while(pb<=pb_last)*pc++=*pb++; //
}
Status ListDelete(SqList *L,int i,ElemType *e)//删除某一数据
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
ElemType *p,*q;
if(i<1||i>(*L).length) /* i值不合法 */
return ERROR;
p=(*L).elem+i-1; /* p为被删除元素的位置 */
*e=*p; /* 被删除元素的值赋给e */
q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */
for(++p;p<=q;++p) /* 被删除元素之后的元素左移 */
*(p-1)=*p;
(*L).length--; /* 表长减1 */
return OK;
}
//清空
void ClearList(SqList *L){
(*L).length=0;//将线性表的长度置为0
}
//销毁线性表
void DestroyList(SqList *L){
free((*L).elem);//释放内存后置空指针
(*L).elem=NULL;
(*L).length=0;
(*L).listsize=0;//释放线性表占据的所有存储空间
}
四。建立main_Sqlish.c文件
#include<stdio.h>
#include "Sqlist.h"
int main(){
SqList L,La,Lb;
int i;
ElemType m,*p;
p=&m;
InitList(&L);
printf("判断线性表是否为空0否1是:%d\n",IsEmpty(L));
printf("该线性表的长度是:%d\n",ListLength(La));
InitList(&La);
ListInsert(&La,1,1);
ListInsert(&La,2,2);
ListInsert(&La,3,3);
ListInsert(&La,4,4);
GetElem(La,3,p);//或去某一位置上的元素
printf("第%d位置的元素为:%d\n",3,*p);
printf("合并前la的顺序表为:\n");
ListTraverse(La);
InitList(&Lb);
ListInsert(&Lb,1,6);
ListInsert(&Lb,2,7);
ListInsert(&Lb,3,8);
ListInsert(&Lb,4,9);
printf("合并前lb的顺序表为:\n");
ListTraverse(Lb);
MergeList(La,Lb,&Lc);
printf("合并后的顺序表为:\n");
ListTraverse(Lc);
printf("该线性表的长度是:%d\n",ListLength(La));
ListDelete(&Lb,2,p);
printf("被删除的元素为%d:\n",*p);
ClearList(La);
printf("该线性表的长度是:%d\n",ListLength(La));
DestroyList(La);
}