定长顺序表
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 10
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int (*Compare)(ElemType, ElemType);
typedef struct SqList
{
ElemType data[LISTSIZE]; // 存储数据元素的空间
int length; // 存储当前已有的数据个数
}SqList, * SqListPtr;
static int IsFull_Sq(SqListPtr sqlist) //判满
{
if(sqlist->length == LISTSIZE)
{
return TRUE;
}
return FALSE;
}
void InitList_Sq (SqListPtr sqlist)//初始化
{
malloc(sizeof(SqListPtr *));
if(sqlist==NULL) exit(0);
sqlist->length =0; //将线性表的当前有效长度设为0
}
int InsertList_Sq_Pos(SqListPtr sqlist,ElemType val,int pos)//按位置插入
{
int i =sqlist->length;
if(sqlist == NULL) exit(0);
if(IsFull_Sq(sqlist)) return FALSE;
if(pos<0||pos>sqlist->length ) return FALSE;
while(i>pos)
{
sqlist->data[i] =sqlist->data[i-1];
i--;
}
sqlist->data [i]= val;
sqlist->length++;
return TRUE;
}
int InsertList_Sq_Head(SqListPtr sqlist, ElemType val)// 头插
{
return InsertList_Sq_Pos(sqlist,val,0);
}
int InsertList_Sq_Tail(SqListPtr sqlist, ElemType val)// 尾插
{
if(sqlist == NULL) exit(0);
return InsertList_Sq_Pos(sqlist,val,sqlist->length);
}
int DeleteList_Sq_Pos(SqListPtr sqlist,int pos)//按位置删除
{
int i=sqlist->length ;
if(sqlist == NULL) exit(0);
if(pos<0||pos>=sqlist->length ) return FALSE;
while(pos< sqlist->length -1)
{
sqlist->data[pos] =sqlist->data [pos+1];
pos++;
}
sqlist->length --;
return TRUE;
}
int DeleteList_Sq_Head(SqListPtr sqlist)//头删
{
return DeleteList_Sq_Pos(sqlist,0);
}
int DeleteList_Sq_Tail(SqListPtr sqlist) //尾删
{
return DeleteList_Sq_Pos(sqlist,sqlist->length-1);
}
ElemType * FindElem_Pos(SqListPtr sqlist,int pos) //按位查找
{
int i=0;
if(sqlist==NULL) exit(0);
if(pos<0||pos>sqlist->length ) return FALSE;
for(;i<sqlist->length ;++i)
{
if(i==pos) return &sqlist->data[i];
}
return NULL;
}
void ShowList_Sq(SqListPtr sqlist)
{
int i=0;
if(sqlist->length==0)
{
printf("\n顺序表为空\n");
}
else
{
for(;i<sqlist->length;i++)
{
printf("%d ",sqlist->data[i]);
}
}
printf("\n");
}
void ClearList_Sq(SqListPtr sqlist)
{
if(sqlist==NULL) return ;
sqlist->length =0;
}
int main()
{
SqList sq;
int i=0;
InitList_Sq(&sq);
for(;i<5;i++)
{
InsertList_Sq_Tail(&sq,i);
}
ShowList_Sq(&sq);
InsertList_Sq_Pos(&sq,10,2); //下标从0开始
ShowList_Sq(&sq);
InsertList_Sq_Head(&sq,2);
ShowList_Sq(&sq);
DeleteList_Sq_Pos(&sq,3);
ShowList_Sq(&sq);
printf("第3个位置为%d\n",*FindElem_Pos(&sq,3));
return 0;
}
运行结果如下:
图中运行结果中的位置从0开始。
不定长顺序表
#include<stdio.h>
#include<stdlib.h>
typedef struct SqList
{
ElemType *data;
int length; //当前存储数据的个数
int listsize; //存储空间
}SqList,*SqListPtr;
#define TRUE 1
#define FALSE 0
int InitList_Sq_Dyn (SqListPtr sq)
{
if(sq == NULL) exit(0);
sq->length =0;
sq->data = (ElemType *)malloc(INIT_SIZE * sizeof(ElemType));
if(sq->data ==NULL) return FALSE;
sq->listsize =INIT_SIZE;
return TRUE;
}
static int IsFull_SqDyn(SqListPtr sq)
{
if(sq->data ==NULL||sq->length == sq->listsize)
{
return TRUE;
}
return FALSE;
}
static int AppendSpace(SqListPtr sq)
{
//申请更大空间
ElemType *data =(ElemType *)malloc(sizeof(ElemType)*sq->listsize *2);
if(data==NULL) return FALSE;
sq->listsize *=2;
//拷贝原始空间的数据
for(int i=0;i<sq->length ;++i)
{
data[i]=sq->data [i];
}
//释放原始空间
free(sq->data);
//将新空间的首地址存储到sq->data上
sq->data =data;
return TRUE;
}
int InsertList_SqDyn_Pos(SqListPtr sq,ElemType val,int pos)
{
if(sq ==NULL) exit(0);
if(pos<0||pos>sq->length ) return FALSE;
if(IsFull_SqDyn(sq)&&!AppendSpace(sq)) //表满且扩容失败
{
return FALSE;
}
for(int i=sq->length ;i>pos;--i)
{
sq->data [i]=sq->data [i-1];
}
sq->data [pos ]= val;
sq->length++;
return TRUE;
}
int DeleteList_SqDyn_Pos(SqListPtr sq,int pos)
{
if(sq == NULL || sq->data == NULL) return FALSE;
if(pos<0 || pos>= sq->length ) return FALSE;
while(pos< sq->length -1)
{
sq->data[pos] =sq->data [pos+1];
pos++;
}
sq->length --;
return TRUE;
}
void ShowList_SqDyn(SqListPtr sq)
{
if(sq == NULL || sq->data ==NULL) exit(0);
for(int i=0;i<sq->length;++i)
{
printf("%d ",sq->data [i]);
}
}
void ClearList_SqDyn(SqListPtr sq)
{
if(sq==NULL) return ;
sq->length =0;
}
void DestroyList_SqDyn(SqListPtr sq)
{
if(sq==NULL) return ;
free(sq->data );
sq->data =NULL;//防止野指针
sq->length =sq->listsize =0;
}
int main()
{
SqList sq;
if(!InitList_Sq_Dyn (&sq))
{
printf("init error\n");
return 0;
}
for(int i=0;i<10;++i)
{
InsertList_SqDyn_Pos (&sq,i,sq.length );
}
ShowList_SqDyn (&sq);
InsertList_SqDyn_Pos(&sq,100,3); //下标均从0开始
ShowList_SqDyn (&sq);
DeleteList_SqDyn_Pos(&sq,3);
ShowList_SqDyn (&sq);
ClearList_SqDyn(&sq);
ShowList_SqDyn (&sq);
return 0;
}
运行结果如下: