sqlist.h
#ifndef SQLIST_H
#define SQLIST_H
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
#define SIZE 10
typedef int ElemType;
struct squencelist
{
int length;
ElemType *data;
};
typedef struct squencelist sqlist;
int SqlistInit(sqlist *l);//初始化
int SqlistInsrt(sqlist *l,int p,ElemType e);//插入
int SqlistLength(sqlist l);//求长度
int GetElem(sqlist l,int p,ElemType *e);//需要查看元素的值,所以要取值
int LocalElem(sqlist l,ElemType e,int (*p)(ElemType,ElemType));//判断元素位置,元素值确定,所以不取值
int SqlistTraverse(sqlist l,void (*p)(ElemType));//没有改变值,不需要取地址
int SqlistEmpty(sqlist l); //只需要看表的长度
int SqlistDelete(sqlist *l,int p,ElemType *e);//删除某个元素
int SqlistClear(sqlist *l); //清空表
int SqlistDestroy(sqlist *l);//销毁表
#endif
sqlist.c
#include "sqlist.h"
#include <stdlib.h>
int SqlistInit(sqlist *l)
{
if(NULL == l)
{
return FAILURE;
}
l->length = 0;
l->data = (ElemType *)malloc(sizeof(ElemType)*SIZE);//分配空间
if(NULL == l->data)
{
return FAILURE;
}
return SUCCESS;
}
int SqlistInsrt(sqlist *l,int p,ElemType e)
{
if(NULL == l) //入参判断
{
return FAILURE;
}
if(p > l->length+1 || p < 1 || l->length > SIZE)//插入位置超出范围
{
return FAILURE;
}
int i;
for(i = 0;i < l->length-p+1;i++)
{
//l->data[l->length - i] = l->data[l->length - i - 1];
l->data[p+i] = l->data[p+i-1];//p位置开始往后移
}
l->data[p-1] = e;
l->length++;
return SUCCESS;
}
int SqlistLength(sqlist l)
{
return l.length;
}
int GetElem(sqlist l,int p,ElemType *e) //*e是用来接p位置值 这里的l不是指针 只是调用
{
if(p < 1 || p > l.length)
{
return FAILURE;
}
*e = l.data[p-1];
return SUCCESS;
}
int LocalElem(sqlist l,ElemType e,int (*p)(ElemType,ElemType))//equal函数
{
int i;
for(i = 0;i < l.length; i++)
{
if(p(e,l.data[i]) == TRUE)
{
return i+1;//已经找到元素相同的位置,将该位置输出
}
}
return FAILURE;
}
int SqlistTraverse(sqlist l,void (*p)(ElemType))
{
if(NULL == p)
{
return FAILURE;
}
int i;
for(i = 0;i < l.length; i++)
{
p(l.data[i]);
}
return SUCCESS;
}
int SqlistEmpty(sqlist l)
{
if(0 == l.length)
{
return TRUE;
}
return FALSE;
}
int SqlistDelete(sqlist *l,int p,ElemType *e)//删除一个元素
{
if(NULL == l)
{
return FAILURE;
}
if(p < 1 || p > l->length)
{
return FAILURE;
}
*e = l->data[p-1];//p位置的元素值
int i;
for(i = 0;i < l->length-p+1; i++)
{
l->data[p + i - 1] = l->data[p + i];
}
l->length--;
return SUCCESS;
}
int SqlistClear(sqlist *l)
{
if(NULL == l)
{
return FAILURE;
}
l->length = 0;
return SUCCESS;
}
int SqlistDestroy(sqlist *l)
{
if(NULL == l)
{
return FAILURE;
}
l->length = 0;
free(l->data);//结构体指针 在初始化时分配了空间
l->data = NULL;//将*data置空,否则为野指针
return SUCCESS;
}
主函数
#include "sqlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void print(ElemType e)
{
printf("%d",e);
}
int equal(ElemType e1,ElemType e2)
{
if(e1 == e2)
return TRUE;
else
return FALSE;
}
int main()
{
int ret;
sqlist list;
srand(time(NULL));
ret = SqlistInit(&list);//初始化
if(ret == SUCCESS)
{
printf("Init success!\n");
}
else
{
printf("Init failure!\n");
}
int i;
for(i = 0; i < 10; i++)// 插入
{
ret = SqlistInsrt(&list,i + 1,rand() % 10);//插入随机数
if(ret == FAILURE )
{
printf("Insert failure!\n");
}
else
{
printf("Insert success!\n");
}
}
ret = SqlistLength(list);
printf("length is %d\n",ret);
int p = 3;
ElemType e;
ret = GetElem(list,p,&e);
if(ret == SUCCESS)
{
printf("GetElem success!\n");
printf("第%d个位置为%d\n",p,e);
}
else
{
printf("GetElem failure!\n");
}
e= 5;
ret = LocalElem(list,e,equal);
if(ret == TRUE)
{
printf("%d do not exist!\n",e);
}
else
{
printf("%d is %dth element\n",e,ret);
}
ret = SqlistTraverse(list,print);
if(ret == FAILURE)
{
printf("traverse failure!\n");
}
else
{
printf("traverse success!\n");
}
ret = SqlistEmpty(list);
if(ret == TRUE)
{
printf("the list is empty!\n");
}
else
{
printf("the list is not empty!\n");
}
ret = SqlistDelete(&list,p,&e);
if(ret == FAILURE)
{
printf("delete failure!\n");
}
else
{
printf("delete success!\n");
}
ret = SqlistTraverse(list,print);
if(ret == FAILURE)
{
printf("traverse failure!\n");
}
else
{
printf("traverse success!\n");
}
ret = SqlistClear(&list);
if(ret == FAILURE)
{
printf("clear failure!\n");
}
else
{
printf("clear success!\n");
}
ret = SqlistTraverse(list,print);
if(ret == FAILURE)
{
printf("traverse failure!\n");
}
else
{
printf("traverse success!\n");
}
ret = SqlistDestroy(&list);
if(ret == FAILURE)
{
printf("destroy failure!\n");
}
else
{
printf("destroy success!\n");
}
return 0;
}