顺序表的创建
sqlink list_create() {
sqlink L;
//申请地址 malloc
L = (sqlink)malloc(sizeof(sqlist));
if (L == NULL) {
printf("list malloc failed\n");
return L;
}
//初始化 inttialize
memset(L, 0, sizeof(sqlist));
L->last = -1;
return L;
}
顺序表结构体描述
typedef int data_t;
#define N 128
typedef struct {
data_t data[N];
int last;
}sqlist, *sqlink;
sqlink list_create();
顺序表置空操作
函数结构
int list_clear(sqlink L);
功能:清空顺序表就是将表中的元素删除。删除表中的元素只需将表的长度置为0。
代码实现:
int list_clear(sqlink L) {
if (L == NULL) {
return -1;
}
memset(L, 0, sizeof(sqlist));
L->last = -1;
return 0;
}
判断顺序表是否为空
函数结构
int list_empty(sqlink L);
功能:判断顺序表是否为空 ;参数L:list; 返回值:1--空 0--非空;
代码实现
int list_empty(sqlink L) {
if (L->last == -1)
return 1;
else
return 0;
}
求顺序表的长度
函数结构
int list_length(sqlink L);
功能:计算顺序表的长度,顺序表的长度就是就顺序表中的元素的个数,last代表最后一个元素的下标。
代码实现
int list_length(sqlink L) {
if (L == NULL)
return -1;
return(L->last+1);
顺序表插入一个元素
函数结构
int list_insert(sqlink L, data_t value, int pos);
功能:在顺序表的pos位置插入元素value;
算法思路:
(1)判断顺序表是否已满;
(2)检查参数pos 0 <= pos <= last+1 ;
(3)移动 (从后向前逐个移动);
(4)存入新值,last++;
代码实现
int list_insert(sqlink L, data_t value, int pos) {
int i;
//1 判断顺序表是否已满
if (L->last == N-1) {
printf("list is full\n");
return -1;
}
//2 0 <= pos <= last+1
if (pos < 0 || pos > last+1) {
printf("pos is invalid\n");
return -1;
}
//3 move
for (i = L->last; i <= L->last; i++) {
L->data[i+1] = L->data[i];
}
//4 update value last
L->data[pos] = value;
L-last++;
return 0;
}
遍历顺序表
函数结构
int list_show(sqlink L);
功能: 依次打印顺序表中的元素,如果顺序表为空则输出提示。
代码实现
int list_show(sqlink L) {
int i
if (L == NULL) {
printf("list is empty\n");
for (i = 0; i<= L->last; i++) {
printf(""%d ", L->data[i]);
}
puts("");
return 0;
}
顺序表元素删除
函数结构
int list_delete(sqlink L, int pos);
功能:Delete(L,i)删除表L中第i个元素ai,且表长减1,要求0 <= i <= n-1.
代码实现
int list_delete(sqlink L, int pos) {
int i;
if (L->last == -1) {
printf("list is empty\n");
return -1;
}
//pos [0, last]
if (pos < 0 || pos > L->last) {
printf("delete pos is invalid\n");
return -1;
}
//move [pos+1, last]
for (i = pos+1; i <= L->last; i++) {
L->data[i-1] = L->data[i];
}
//update
L->last--;
return 0;
}
顺序表合并
函数结构
int list_merge(sqlink L1, sqlink L2);
算法思路:一次去表Lb中的bi(i =0,1,2......,n-1),若bi不属于La,则将其插入到La中
代码实现
int list_merge(sqlink L1, sqlink L2) {
int i = 0;
int ret;
while (i <= L2->last){
ret = list_locate(L1, L2->data[i]);
if (ret == -1) {
if (list_insert(L1, L2->data[i], L1->last+1) == -1)
return -1;
}
i++;
}
return 0;
}
删除顺序表中的重复元素
函数结构
int list_purge(sqlink L);
代码实现
int list_purge(sqlink L) {
int i;
int j;
if (L->last == 0)
return 0;
i = 1;
while (i <= L->last) {
j = i-1;
while (j >= 0) {
if (L->data[i] == L->data[j]) {
list_delete(L, i);
break;
} else {
j--;
}
}
if ( j < 0) {
i++;
}
}
return 0;
}
顺序表的基础操作完整代码
linkList.h数据结构的定义和基本操作函数声明
typedef int data_t;
#define N 128
typedef struct {
data_t data[N];
int last;
}sqlist, *sqlink;
sqlink list_create();
int list_clear(sqlink L);
int list_free(sqlink L);
int list_empty(sqlink L);
int list_length(sqlink L);
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int pos);
int list_delete(sqlink L, int pos);
int list_merge(sqlink L1, sqlink L2);
int list_purge(sqlink L);
int list_show(sqlink L);
linkList.c 函数的具体实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlist.h"
sqlink list_create() {
//malloc
sqlink L;
L =(sqlink)malloc(sizeof(sqlist));
if (L == NULL) {
printf("list malloc failed\n");
return L;
}
//initialize
memset(L, 0, sizeof(sqlist));
L->last = -1;
//return
return L;
}
/*
* @ret 0-success -1-failed
* */
int list_clear(sqlink L) {
if (L == NULL)
return -1;
memset(L, 0, sizeof(sqlist));
L->last = -1;
return 0;
}
int list_free(sqlink L){
if (L == NULL)
return -1;
free(L);
L = NULL;
return 0;
}
/*
* list_empty: Is list empty?
* para L: list
* @ret 1--empty 0--not empty
* */
int list_empty(sqlink L) {
if (L->last == -1)
return 1;
else
return 0;
}
int list_length(sqlink L) {
if (L == NULL)
return -1;
return (L->last+1);
}
/*
* @ret -1--not exist pos
* */
int list_locate(sqlink L, data_t value) {
int i ;
for (i = 0; i <= L->last; i++) {
if (L->data[i] == value)
return i;
}
return -1;
}
int list_insert(sqlink L, data_t value, int pos) {
int i;
//full
if (L->last == N-1) {
printf("list is full\n");
return -1;
}
//check para 0<=pos<=Last+1 [0, last+1]
if (pos < 0 || pos > L->last+1) {
printf("Pos is invalid\n");
return -1;
}
//move
for (i = L->last; i >= pos; i--) {
L->data[i+1] = L->data[i];
}
//update value last
L->data[pos] = value;
L->last++;
return 0;
}
int list_show(sqlink L) {
int i;
if (L == NULL)
return -1;
if (L->last == -1)
printf("list is empty\n");
for (i = 0; i <= L->last; i++) {
printf("%d ", L->data[i]);
}
puts("");
return 0;
}
int list_delete(sqlink L, int pos) {
int i;
if (L->last == -1) {
printf("list is empty\n");
return -1;
}
//pos [0, last]
if (pos < 0 || pos > L->last) {
printf("delete pos is invalid\n");
return -1;
}
//move [pos+1, last]
for (i = pos+1; i <= L->last; i++) {
L->data[i-1] = L->data[i];
}
//update
L->last--;
return 0;
}
int list_merge(sqlink L1, sqlink L2) {
int i = 0;
int ret;
while (i <= L2->last){
ret = list_locate(L1, L2->data[i]);
if (ret == -1) {
if (list_insert(L1, L2->data[i], L1->last+1) == -1)
return -1;
}
i++;
}
return 0;
}
int list_purge(sqlink L) {
int i;
int j;
if (L->last == 0)
return 0;
i = 1;
while (i <= L->last) {
j = i-1;
while (j >= 0) {
if (L->data[i] == L->data[j]) {
list_delete(L, i);
break;
} else {
j--;
}
}
if ( j < 0) {
i++;
}
}
return 0;
}
mian.c函数的简单测试代码
#include <stdio.h>
#include "sqlist.h"
void test_insert();
void test_delete();
void test_merge();
void test_purge();
int main(int argc, const char *argv[])
{
//test_insert();
//test_delete();
//test_merge();
test_purge();
return 0;
}
void test_insert() {
sqlink L;
L = list_create();
if (L == NULL)
return;
list_insert(L, 10, 0);
list_insert(L, 20, 0);
list_insert(L, 30, 0);
list_insert(L, 40, 0);
list_insert(L, 50, 0);
list_insert(L, 60, 0);
list_show(L);
//list_insert(L, 100, list_length(L));
list_insert(L, 100, -1000);
list_show(L);
list_free(L);
}
void test_delete() {
sqlink L;
L = list_create();
if (L == NULL)
return;
list_insert(L, 10, 0);
list_insert(L, 20, 0);
list_insert(L, 30, 0);
list_insert(L, 40, 0);
list_insert(L, 50, 0);
list_insert(L, 60, 0);
list_show(L);
list_delete(L, 9);
list_show(L);
list_free(L);
}
void test_merge() {
sqlink L1, L2;
L1 = list_create();
if (L1 == NULL)
return;
L2 = list_create();
if (L2 == NULL)
return;
list_insert(L1, 10, 0);
list_insert(L1, 20, 0);
list_insert(L1, 30, 0);
list_insert(L1, 40, 0);
list_insert(L2, 50, 0);
list_insert(L2, 20, 0);
list_insert(L2, 90, 0);
list_insert(L2, 40, 0);
list_show(L1);
list_show(L2);
printf("********************\n");
list_merge(L1, L2);
list_show(L1);
list_show(L2);
}
void test_purge() {
sqlink L;
L = list_create();
if (L == NULL)
return;
list_insert(L, 10, 0);
list_insert(L, 10, 0);
list_insert(L, 10, 0);
list_insert(L, 10, 0);
list_insert(L, 10, 0);
list_insert(L, 10, 0);
list_show(L);
list_purge(L);
list_show(L);
list_free(L);
}