头文件
#ifndef LINER_LIST_SEQLIST_H
#define LINER_LIST_SEQLIST_H
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <stdbool.h>
#define SEQLIST_INIT_SIZE 8
#define INC_SIZE 3
typedef int ElemType;
typedef struct SeqList {
ElemType *base;
int capacity;
int size;
} SeqList;
bool Inc(SeqList *list);
void InitSeqList(SeqList *list);
void push_back(SeqList *list, ElemType x);
void show_list(SeqList *list);
void push_front(SeqList *list, ElemType x);
void pop_back(SeqList *list);
void pop_front(SeqList *list);
void insert_pos(SeqList *list, int pos, ElemType item);
int find(SeqList *list, ElemType x);
int length(SeqList *list);
void delete_pos(SeqList *list, int pos);
void delete_val(SeqList *list, ElemType x);
void sort(SeqList *list);
void resver(SeqList *list);
void clear(SeqList *list);
void destory(SeqList *list);
void merge(SeqList *lt, SeqList *la, SeqList *lb);
#endif //LINER_LIST_SEQLIST_H
主函数
#include "SeqList.h"
void main(){
SeqList mylist,youlist,list;
InitSeqList(&mylist);
InitSeqList(&youlist);
push_back(&mylist,1);
push_back(&mylist,3);
push_back(&mylist,5);
push_back(&mylist,7);
push_back(&youlist,2);
push_back(&youlist,3);
push_back(&youlist,6);
push_back(&youlist,9);
merge(&list,&mylist,&youlist);
show_list(&list);
}
/*void main() {
SeqList mylist;
InitSeqList(&mylist);
ElemType item;
int pos;
int select = 1;
while (select) {
printf("*********************************\n");
printf("* [1] push_back [2] push_front *\n");
printf("* [3] show_list [4] pop_back *\n");
printf("* [5] pop_front [6] insert_pos *\n");
printf("* [7] find [8] lenght *\n");
printf("* [9] delete_pos [10] delete_val \n");
printf("* [11] sort [12] resver *\n");
printf("* [13] clear [14] destory *\n");
printf("* [0] exit_system");
printf("*********************************\n");
printf("请选择:>");
scanf("%d", &select);
if (select == 0)
break;
switch (select) {
case 1:
printf("请输入要插入的数据:(-1结束)>");
while (scanf("%d", &item), item != -1) {
push_back(&mylist, item);
}
break;
case 2:
printf("请输入要插入的数据:(-1结束)>");
while (scanf("%d", &item), item != -1) {
push_front(&mylist, item);
}
break;
case 3:
show_list(&mylist);
break;
case 4:
pop_back(&mylist);
break;
case 5:
pop_front(&mylist);
break;
case 6:
printf("请输入要插入的数据:>");
scanf("%d", &item);
printf("请输入要插入的位置:>");
scanf("%d", &pos);
insert_pos(&mylist, pos, item);
break;
case 7:
printf("请输入要查找的数据");
scanf("%d", &item);
pos = find(&mylist, item);
if (pos == -1) {
printf("元素不在表内");
} else {
printf("元素找到了,位置索引为%d\n", pos);
}
break;
case 8:
printf("顺序表的长度为:> %d\n",length(&mylist));
break;
case 9:
printf("请输入要删除数据的位置:>");
scanf("%d",&pos);
delete_pos(&mylist,pos);
break;
case 10:
printf("请输入要删除的数据:>");
scanf("%d",&item);
delete_val(&mylist,item);
break;
case 11:
printf("sorted :>");
sort(&mylist);
break;
case 12:
printf("resver:>");
resver(&mylist);
break;
case 13:
printf("清除");
clear(&mylist);
break;
case 14:
destory(&mylist);
break;
default:
printf("输入的选择错误,请重新输入:>");
break;
}
}
}
*/
其他函数
#include "SeqList.h"
void InitSeqList(SeqList *list) {
list->base = (ElemType *) malloc(sizeof(ElemType) * SEQLIST_INIT_SIZE);
assert(list->base != NULL);
list->capacity = SEQLIST_INIT_SIZE;//初始存储容量
list->size = 0;//空表长度
}
//尾插
void push_back(SeqList *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) {
printf("顺序表的空间已满,%d不能尾部插入数据\n", x);
return;
}
list->base[list->size] = x;
list->size++;
}
//头插
void push_front(SeqList *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) {
printf("顺序表的空间已满,%d不能尾部插入数据\n", x);
return;
}
for (int i = list->size; i > 0; i--) {
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}
//删除pop_back
void pop_back(SeqList *list) {
if (list->size == 0) {
printf("表长为0,无法进行删除");
return;
}
list->size--;
}
//删除 pop_front
void pop_front(SeqList *list) {
if (list->size == 0) {
printf("表长为0,无法进行删除");
return;
}
for (int i = 0; i < list->size - 1; ++i) {
list->base[i] = list->base[i + 1];
}
list->size--;
}
//插入insert_pos
void insert_pos(SeqList *list, int pos, ElemType x) {
if (pos < 0 || pos > list->size) {
printf("插入数据的位置非法,不能插入数据:\n");
return;
}
if (list->size >= list->capacity && !Inc(list)) {
printf("顺序表的空间已满,%d不能按位置插入数据\n", x);
return;
}
// if (pos == 0) {
// push_front(list, x);
// } else if (pos == list->size) {
// push_back(list, x);
// } else {
for (int i = list->size; i > pos; --i) {
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}
//查找
int find(SeqList *list, ElemType x) {
for (int i = 0; i < list->size; ++i) {
if (list->base[i] == x) {
return i;
}
}
return -1;
}
//长度
int length(SeqList *list) {
return list->size;
}
//删除位置元素
void delete_pos(SeqList *list, int pos) {
if (pos < 0 || pos >= list->size) {
printf("删除数据的位置非法,不能删除数据:\n");
return;
}
for (int i = pos; i < list->size - 1; i++) {
list->base[i] = list->base[i + 1];
}
list->size--;
}
//删除指定内容的数据
void delete_val(SeqList *list, ElemType x) {
// for (int i = 0; i < list->size; ++i) {
// if(list->base[i] == x){
// for (int j = i; j < list->size-1; ++j) {
// list->base[i] = list->base[i+1];
// }
// list->size--;
// }
// else{
// printf("输入删除的数据有误");
// }
// }
// 利用前面写完的函数
int pos = find(list, x);
if (pos == -1) {
printf("要删除的数据不存在\n");
return;
}
delete_pos(list, pos);
}
//顺序表排序(冒泡)
void sort(SeqList *list) {
for (int i = 0; i < list->size - 1; ++i) {
for (int j = 0; j < list->size - 1 - i; ++j) {
if (list->base[j] > list->base[j + 1]) {
list->base[j] ^= list->base[j + 1];
list->base[j + 1] ^= list->base[j];
list->base[j] ^= list->base[j + 1];
}
}
}
}
//逆置
void resver(SeqList *list) {
if (list->size == 0 || list->size == 1) {
return;
}
int low;
int hight;
for (low = 0, hight = list->size - 1; low < hight; low++, hight--) {
list->base[low] ^= list->base[hight];
list->base[hight] ^= list->base[low];
list->base[low] ^= list->base[hight];
}
}
//清除
void clear(SeqList *list) {
list->size = 0;
}
//摧毁
void destory(SeqList *list) {
free(list->base);
list->base = NULL;
list->capacity = 0;
list->size = 0;
}
//
bool Inc(SeqList *list) {
ElemType *newbase = (ElemType *) realloc(list->base, sizeof(ElemType) * (list->capacity + INC_SIZE));
if (newbase == NULL) {
printf("增配空间失败,内存不足\n");
return false;
}
list->base = newbase;
list->capacity += INC_SIZE;
return true;
}
//合并顺序表
void merge(SeqList *lt, SeqList *la, SeqList *lb) {
lt->capacity = la->size + lb->size;
lt->base = (ElemType *) malloc(sizeof(ElemType) * lt->capacity);
assert(lt->base != NULL);
int ia = 0;
int ib = 0;
int ic = 0;
while (ia < la->size && ib < lb->size) {
if (la->base[ia] < lb->base[ib])
lt->base[ic++] = la->base[ia++];
else
lt->base[ic++] = la->base[ib++];
}
while (ia < la->size) {
lt->base[ic++] = la->base[ia++];
}
while (ib < lb->size) {
lt->base[ic++] = la->base[ib++];
}
lt->size = la->size + lb->size;
}
//打印顺序表内容
void show_list(SeqList *list) {
printf("顺序表如下: ");
for (int i = 0; i < list->size; ++i) {
printf("%2d", list->base[i]);
}
putchar(10);
}