C语言-顺序表实现的例子
利用顺序表建立一个顺序表结构体,实现顺序表的初始化、添加数据、插入数据、删除数据、获取数据、获取元素个数、打印、遍历、排序、销毁操作。
SeqType.h
文件:
#include<stdbool.h>
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
//顺序表结构体
typedef int SeqType;
typedef struct{
SeqType* data;//动态数组
int size;//元素个数
} List;
//初始化
bool list_init(List* seq);
//销毁
void list_destroy(List* seq);
//基本操作
//添加数据
void list_append(List* seq,SeqType val);
void list_prepend(List* seq,SeqType val);
//插入数据
void list_insert(List* seq,int index,SeqType val);
//删除数据
void list_delete(List* seq,int index);
//获取数据
SeqType list_get(List* seq,int index);
//获取元素个数
int list_size(List* seq);
//打印
void list_print(List* seq);
//遍历
typedef void(*traval_t)(SeqType* val);
void list_traval(List* seq,traval_t func);
//排序
void list_sort(List* seq);
#endif //__SEQLIST_H__
SeqType.c
文件:
#include<stdio.h> // NULL
#include<stdbool.h>
#include<assert.h>
#include"SeqList.h"
#include<stdlib.h> //malloc() realloc()
#include<string.h> //memcpy
//初始化
bool list_init(List* seq){
assert(NULL!=seq);
seq->data=NULL;
seq->size=0;
}
//销毁
void list_destroy(List* seq){
assert(NULL!=seq);
free(seq->data);
seq->data=NULL;
seq->size=0;
}
//基本操作
//添加数据
void list_append(List* seq,SeqType val){
assert(NULL!=seq);
/*
if(NULL==seq->data){
seq->data = malloc(sizeof(SeqType));
seq->data[0] = val;
}else{
seq->data = realloc(seq->data,(seq->size+1)*sizeof(SeqType));
seq->data[seq->size] = val;
}
seq->size++
*/
seq->size++;
seq->data = realloc(seq->data,seq->size*sizeof(SeqType));
seq->data[seq->size-1] = val;
}
void list_prepend(List* seq,SeqType val){
assert(NULL!=seq);
seq->size++;
seq->data = realloc(seq->data,seq->size*sizeof(SeqType));
memcpy(seq->data+1,seq->data,(seq->size-1)*sizeof(SeqType));
seq->data[0] = val;
}
//插入数据
void list_insert(List* seq,int index,SeqType val){
assert(NULL!=seq);
assert(index >= 0 && seq->size >= index);
seq->size++;
seq->data = realloc(seq->data,seq->size*sizeof(SeqType));
memcpy(seq->data+index+1,seq->data+index,(seq->size-1-index)*sizeof(SeqType));
seq->data[index] = val;
}
//删除数据
void list_delete(List* seq,int index){
assert(NULL!=seq);
assert(index >= 0 && seq->size > index);
memcpy(seq->data+index,seq->data+index+1,(seq->size-index)*sizeof(SeqType));
seq->size--;
}
//获取数据
SeqType list_get(List* seq,int index){
assert(NULL!=seq);
assert(index >=0 && seq->size > index);
return seq->data[index];
}
//获取元素个数
int list_size(List* seq){
assert(NULL!=seq);
return seq->size;
}
//打印
void list_print(List* seq){
assert(NULL != seq);
for(int i=0;i<seq->size;i++){
printf("%d ",seq->data[i]);
}
printf("\n");
}
//遍历
typedef void(*traval_t)(SeqType* val);
void list_traval(List* seq,traval_t func){
assert(NULL!=seq);
assert(NULL!=func);
for(int i=0;i<seq->size;i++){
(*func)(seq->data+i);
}
}
//排序
int list_comp_element(const void* a,const void* b){
return *(SeqType*)a - *(SeqType*)b;
}
void list_sort(List* seq){
qsort(seq->data,seq->size,sizeof(SeqType),list_comp_element);
}
SeqType_main.c
文件(部分测试):
#include<stdio.h>
#include"SeqList.h"
void PrintElement(SeqType* val){
printf("%d ",*val);
}
int main(){
List l;
list_init(&l);
list_append(&l,1);
list_append(&l,2);
list_append(&l,3);
list_append(&l,4);
list_print(&l);
//list_print(NULL);
list_insert(&l,2,100);
list_print(&l);
list_insert(&l,0,200);
list_print(&l);
list_insert(&l,5,300);
list_print(&l);
/*
for(int i=0;i<list_size(&l);i++){
printf("%d ",list_get(&l,i));
}
printf("\n");
*/
list_traval(&l,PrintElement);
printf("\n");
list_sort(&l);
list_print(&l);
list_destroy(&l);
}
运行结果: