结构:
typedef int status;
typedef int elemtype;
typedef struct {
elemtype *elem;
int length;
int listsize;
}sqlist;
线性表初始化: LIST_INIT_SIZE为宏
status initlist(sqlist *l) { //initial list
l->elem = malloc(LIST_INIT_SIZE * sizeof(elemtype));
if (!l->elem) return ERROR;
l->length = 0;
l->listsize = LIST_INIT_SIZE;
return OK;
}
线性表销毁:
status destroylist(sqlist *l) { //destroy list
free(l->elem);
l->elem = NULL;
l->length = 0;
l->listsize = 0;
return OK;
}
free 释放空间后,l->elem的值不会变,手动置为NULL。
线性表插入:
status listinsert(sqlist *l, int i, elemtype e) { //在i的位置插入一个元素e
elemtype *p, *q, *new;//加一个new是有好处的,在内存分配失败的情况下不会影响原有的变量
if (i<1 || i>l->length + 1) return ERROR;
if (l->length >= l->listsize) {
new = realloc(l->elem, (LISTINCREMENT + l->listsize) * sizeof(elemtype));
if (!new) return ERROR;
l->elem = new;
l->listsize += LISTINCREMENT;
}
q = l->elem + i - 1;
for (p =l->elem + l->length - 1;q <= p;p--)
*(p + 1) = *p;
*q = e;
++l->length;
return OK;
}
线性表删除:
status listdelete(sqlist *l, int i, elemtype *e) {
if (i<1 || i>l->length) return ERROR;
elemtype *p, *q;
p = l->elem + i - 1;
*e = *p;
for (q = p + 1;q <= l->elem + l->length - 1;q++)
*(q - 1) = *q;
l->length--;
return OK;
}
取出某个位置的元素:
status getelem(sqlist l, int i, elemtype *e) {
if (i<1 || i>l.length) return ERROR;
*e = *(l.elem + i - 1);
return OK;
}
顺序表插入、删除麻烦,找元素很方便
打印顺序表:
void print(elemtype *p) {
printf("%d\n", *p);
}
status listtraverse(sqlist l, void(*vi)(elemtype *)) {
int i;
elemtype *p = l.elem;
for (i = 1;i <= l.length;i++)
vi(p++);
return OK;
}
利用函数来实现输出功能是有好处的,对于复杂的结构只需要修改print即可。