顺序表的一些操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"sqlist.h"
/*
*创建一个为0的空顺序表
*/
sqlink list_create(){
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));
memset(L, 0, sizeof(sqlist));
L->last = -1;
return L;
}
/*
* 释放内存
*/
int list_free(sqlink L){
if(L==NULL)
return -1;
free(L);
L=NULL;
}
/*
* 清空顺序表
*/
int list_clear(sqlink L){
if (L == NULL)
return -1;
L->last = -1;
return 0;
}
/*
*获取顺序表的长度
*/
int list_length(sqlink L){
if (L == NULL)
return -1;
return (L->last+1);
}
/*
* 判断元素是否在表中
*@ret -1-->不在, 否则返回位置
*/
int list_locate(sqlink L, data_t value){
int i = 0;
if (L == NULL)
return -1;
while (i <= L->last){
if (L->data[i] == value)
return i;
i++;
}
return -1;
}
/*
* 判断顺序表是否为空,0为空,1为飞空
*/
int list_empty(sqlink L){
if(L == NULL)
return -1;
if(L->last == -1)
return 1;
return 0;
}
/*
* 插入一个元素
*/
int list_insert(sqlink L, data_t value, int pos){
int i;
if(L==NULL)
return -1;
if(L->last == N-1)
{
printf("list is full\n");
return -1;
}
if(pos < 0 || pos > L->last+1){
printf("pos is invaild\n");
return -1;
}
for(i=L->last; pos<=i;i--){
L->data[i+1] = L->data[i];
}
L->data[pos] = value;
L->last++;
return 0;
}
/*
* 遍历顺序表
*/
int list_show(sqlink L){
int i;
if(L == NULL)
return -1;
for(i=0; i <= L->last; i++){
printf("%d ", L->data[i]);
}
puts("");
}
/*
* 删除顺序表的第pos个元素
*/
int list_delete(sqlink L, int pos){
int i;
if (L == NULL)
return -1;
if (pos < 0 || pos > L->last){
printf("del_pos is invaild\n");
return -1;
}
for (i=pos; i <= L->last; i++){
L->data[i] = L->data[i+1];
}
L->last--;
return 0;
}
/*
* 两个表求并集
*/
int list_merge(sqlink L1, sqlink L2){
int i = 0;
while (i <= L2->last){
if (list_locate(L1, L2->data[i]) == -1)
if (list_insert(L1, L2->data[i], L1->last+1) == -1)
return -1;
i++;
}
return 0;
}
/*
* 清楚表中的重复元素
*/
int list_purge(sqlink L){
/* int i, j;
i = 1;
while (i <= L->last){
j = i - 1;
while (j >= 0){
if (L->data[i] == L->data[j]){
list_delete(L, i);
break;
}
j--;
}
if (j < 0)
i++;
}
return 0;
*/
int i, j, k;
i = 1;
while (i <= L->last){
j = i - 1;
while (j >= 0){
if (L->data[i] == L->data[j]){
k = i;
while (k < L->last){
L->data[k] = L->data[k+1];
k++;
}
L->last--;
break;
}
j--;
}
if (j < 0)
i++;
}
return 0;
}