线性表实现代码笔记(C)
在C语言中,一维数组的元素也是存放于一片连续的存储空间中,故可借助于C语言中
一-维数组类型来描述线性表的顺序存储结构,即
功能:
➢[1] push_back ➢[2] push_fornt
➢[3] show_list ➢[4] pop_back
➢[5] pop_font ➢[6] insert_pos
➢[7] find ➢[8] length
➢[9] delete_pos ➢[10] delete_val ;
➢[11] sort ➢[12] resver_list
➢[13] clear ➢[14] destroy(程序结束)
➢[0] quit_system
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include<iostream>
#define INC_SIZE 3
#define SEQLIST_INIT_SIZE 8
typedef int ElemType;
typedef struct SeqList {
ElemType *base; //指向真实所开辟的空间
int capacity; //容量
int size; //大小 相当于有效个数
}SeqList;
bool Inc(SeqList * Mylist);
void show();
void InitSeqList(SeqList *mylist);
void push_back(SeqList *mylist, ElemType x);//尾部插入 ElemType x为数据
void push_fornt(SeqList *mylist, ElemType x);//头部插入
void show_list(SeqList * Mylist);
void pop_back(SeqList * Mylist); //尾删
void pop_font(SeqList * Mylist);//头删
void insert_pos(SeqList * Mylist, int pos, ElemType x);//按位置插入
int findfind_List(SeqList * Mylist, ElemType key);
int length(SeqList * Mylist);
void delete_pos(SeqList * Mylist,int pos);
void delete_val(SeqList * Mylist, ElemType key);
void sort(SeqList * Mylist);
void resver_list(SeqList * Mylist);
void clear(SeqList * Mylist);
void destory(SeqList * Mylist);
void main() {
ElemType Item;
SeqList mylist;
InitSeqList(&mylist);
int pos;
int select = 1;
while (select)
{
printf("* [1] push_back [2] push_fornt *\n");
printf("* [3] show_list [4] pop_back *\n");
printf("* [5] pop_font [6] insert_pos *\n");
printf("* [7] find [8] length *\n");
printf("* [9] delete_pos [10] delete_val *\n");
printf("* [11] sort [12] resver_list *\n");
printf("* [13] clear [14] destroy(程序结束) *\n");
printf("* [0] quit_system *\n");
printf("请选择:");
scanf_s("%d", &select);
if (select == 0) {
break;
}
switch (select) {
case 1:
printf("请输入要插入的数据(-1结束):");
printf("可输入多个数据:\n");
while (scanf_s("%d", &Item), Item != -1) {
push_back(&mylist, Item);
}
break;
case 2:
printf("请输入要插入的数据(-1结束):");
printf("可输入多个数据:\n");
while (scanf_s("%d", &Item), Item != -1) {
push_fornt(&mylist, Item);
}
break;
case 3:
show_list(&mylist);
break;
case 4:
pop_back(&mylist);
break;
case 5:
pop_font(&mylist);
break;
case 6:
printf("请输入要插入的数据:>");
scanf_s("%d", &Item);
printf("请输入要插入的位置:");
scanf_s("%d", &pos);
insert_pos(&mylist,pos,Item);
break;
case 7:
printf("请输入要查找的数据:");
scanf("%d", &Item);
pos = findfind_List(&mylist, Item);
if (pos == -1)
printf("查找的数据%d在顺序表中不存在\n", Item);
else
printf("查找的数据%d在顺序表中的%d下标位置\n", Item, 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:
sort(&mylist);
break;
case 12:
resver_list(&mylist);
break;
case 13:
clear(&mylist);
break;
/*case 14:
destory(&mylist);
break;*/
default:
printf("输入有误!请重新输入!\n");
break;
}
}
destory(&mylist);
system("pause");
}
//初始化
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 *mylist, ElemType x) {
if (mylist->size >= mylist->capacity && !Inc(mylist)) {
printf("顺序表空间已满,不能尾部插入数据.\n");
return;
}
mylist->base[mylist->size] = x;
mylist->size++;
}
//头部插入
void push_fornt(SeqList *mylist, ElemType x) {
if (mylist->size >= mylist->capacity && !Inc(mylist)) {
printf("顺序表空间已满,%d不能尾部插入数据.\n",x);
return;
}
for (int i = mylist->size; i >0; i--) {
mylist->base[i] = mylist->base[i-1];
}
mylist->base[0] = x;
mylist->base[mylist->capacity] = x;
mylist->size++;
}
void show_list(SeqList * Mylist) {
int i;
for ( i = 0; i < Mylist->size; i++) {
printf("%d ", Mylist->base[i]);
}
printf("\n");
}
//尾部删除
void pop_back(SeqList * Mylist) {
if (Mylist->size == 0) {
printf("顺序表为空表,尾部不能删除数据!\n");
return;
}
Mylist->size--;
}
//头部删除
void pop_font(SeqList * Mylist) {
if (Mylist->size == 0) {
printf("顺序表为空表,尾部不能删除数据!\n");
return;
}
for (int i = 0; i < Mylist->size - 1; i++) {
Mylist->base[i] = Mylist->base[i + 1];
}
Mylist->size--;
}
//按照位置插入数据
void insert_pos(SeqList * Mylist, int pos, ElemType x) {
if (pos < 0 || pos > Mylist->size) {
printf("插入数据的位置非法,不能插入数据.\n");
}
if (Mylist->size >= mylist->capacity && !Inc(mylist)) {
printf("顺序表空间已满,%d不能按位置插入数据.\n", x);
return;
}
/*if (pos == 0) {
push_fornt(Mylist,x);
}
else if (pos == Mylist->size) {
push_back(Mylist, x);
}
else {*/
for (int i = Mylist->size; i > pos; --i) {
Mylist->base[i] = Mylist->base[i - 1];
}
Mylist->base[pos] = x;
Mylist->size++;
/*}*/
}
int findfind_List(SeqList * Mylist, ElemType key) {
int i;
for ( i = 0; i < Mylist->size; i++) {
if (Mylist->base[i] == key) {
return i;
}
}
return -1;
}
int length(SeqList * Mylist) {
return Mylist->size;
}
void delete_pos(SeqList * Mylist, int pos) {
if (pos < 0 || pos >= Mylist->size) {
printf("删除数据的位置非法,不能删除数据.\n");
}
for (int i = pos; i < Mylist->size-1; i++) {
Mylist->base[i] = Mylist->base[i + 1];
}
Mylist->size--;
}
void delete_val(SeqList * Mylist, ElemType key) {
int pos = findfind_List(Mylist, key);
if (pos == -1) {
printf("要删除的数据不存在");
return;
}
delete_pos(Mylist, pos);
}
void sort(SeqList * Mylist) {
int i, j, temp;
/*for (i = 0; i < Mylist->size - 1; i++) {
for (j = 0; j < Mylist->size - 1 - i; j++) {
if (Mylist->base[j]>Mylist->base[j + 1]) {
temp = Mylist->base[j];
Mylist->base[j] = Mylist->base[j + 1];
Mylist->base[j + 1] = temp;
}
}
}*/
for (i = 0; i < Mylist->size; i++) {
for (j = i + 1; j < Mylist->size; j++) {
if (Mylist->base[i]>Mylist->base[j]) {
temp = Mylist->base[i];
Mylist->base[i] = Mylist->base[j];
Mylist->base[j] = temp;
}
}
}
show_list(Mylist);
}
void resver_list(SeqList * Mylist) {
if (Mylist->size == 0 || Mylist->size == 1) {
return;
}
int low = 0;
int high = Mylist->size - 1;
ElemType temp;
while (low < high) {
temp = Mylist->base[low];
Mylist->base[low] = Mylist->base[high];
Mylist->base[high] = temp;
low++;
high--;
}
return;
}
void clear(SeqList * Mylist) {
Mylist->size = 0;
}
void destory(SeqList * Mylist) {
free(Mylist->base);
Mylist->base = NULL;
Mylist->capacity = 0;
Mylist->size = 0;
}
//重新对已有的空间开辟内存空间
bool Inc(SeqList * Mylist) {
ElemType *newbase = (ElemType*)realloc(Mylist->base, sizeof(ElemType)*(Mylist->capacity + INC_SIZE));
if (newbase ==NULL) {
printf("增配空间失败,内存不足!");
return false;
}
Mylist->base = newbase;
Mylist->capacity += INC_SIZE;
return false;
}
补充(2个线性表合并成一个有序的线性表)
//2个线性表合并
void merge(SeqList *la, SeqList * lb, SeqList *lt) {
lt->capacity = la->size + la->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++] = lb->base[ib++];
}
}
while (ia<la->size) {
lt->base[ic++] = la->base[ia++];
}
while (ib < lb->size) {
lt->base[ic++] = lb->base[ib++];
}
lt->size = la->size + la->size;
}