//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
//头文件
#ifndef _SEQLIST_H
#define _SEQLIST_H
#include<stdio.h>
typedef int ElemType;
#define INIT_SIZE 8
typedef struct SeqList
{
ElemType *base;
size_t capacity;
size_t size;
}SeqList;
int isempty(SeqList *list);
int isfull(SeqList *list);
void InitList(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,ElemType x,int pos);
void quit_system(SeqList *list,int *x);
int find(SeqList *list,ElemType x);
int length(SeqList *list);
void insert_val(SeqList *list,ElemType x);
void sort(SeqList *list);
void delete_pos(SeqList *list,int pos);
void delete_val(SeqList *list,ElemType x);
void clear(SeqList *list);
void destory(SeqList *list);
void reverse(SeqList *list);
#endif
//函数文件
#include"SeqList.h"
int i;
int isempty(SeqList *list) //检测表是否满
{
return list->size == 0;
}
int isfull(SeqList *list) //检测表是否空
{
return list->size >= list->capacity;
}
void InitList(SeqList *list) //表初始化
{
list->capacity = INIT_SIZE;
list->base = (ElemType *)malloc(sizeof(ElemType)*list->capacity);
list->size = 0;
}
void push_back(SeqList *list,ElemType x) //尾插
{
if (isfull(list))
{
printf("顺序表已满,不能插入!\n") ;
return;
}
list->base[list->size] = x;
list->size++;
}
void show_list(SeqList *list) //显示
{
if (list->size == 0)
{
printf("顺序表为空。\n");
return;
}
for (i = 0; i<list->size; ++i)
{
printf("%d ",list->base[i]);
}
printf("\n");
}
void push_front(SeqList *list,ElemType x) //头插
{
if (isfull(list))
{
printf("顺序表已满,不能插入!\n");
return;
}
for (i = list->size; i > 0; i--)
{
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
(list->size)++;
}
void pop_front(SeqList *list) //头删
{
if (isempty(list))
{
printf("顺序表为空,不能删除\n");
return;
}
for (i = 0; i < list->size; i++)
{
list->base[i] = list->base[i + 1];
}
(list->size)--;
}
void pop_back(SeqList *list) //尾删
{
if (isempty(list))
{
printf("顺序表为空,不能删除\n");
return;
}
list->size--;
}
void insert_pos(SeqList *list,int pos) ////按位置插
{
if (pos<0 || pos>list->size)
{
printf("插入的位置不正确。\n ");
return;
}
if (isempty(list))
{
printf("顺序表已满,不能插入.\n");
return;
}
for (i = list->size; i > pos; i--)
{
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}
void quit_system(SeqList *list,int *x) //退出
{
*x = 0;
}
int find(SeqList *list,ElemType x) //查找
{
for (i = 0; i < list->size; i++)
{
if (list->base[i]==x)
return i;
}
return -1;
}
int length(SeqList *list) //求长度
{
return list->size;
}
void insert_val(SeqList *list,ElemType x) //按值插入
{
push_back(list,x);
sort(list);
}
void sort(SeqList *list) //排序
{
if (isempty(list))
{
return;
}
for (int i = 1; i < list->size; i++)
{
for (int j = 0; j < list->size - i; j++)
{
int temp;
if (list->base[j]>list->base[j + 1])
{
temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
void delete_pos(SeqList *list,int pos) //按位置删除
{
if (isempty(list))
{
printf( "顺序表为空,不能删除。\n" );
return;
}
if (pos < 0 || pos >= list->size)
{
printf("删除的位置不正确。\n");
return;
}
for (int i = pos; i < list->size; ++i)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}
void delete_val(SeqList *list,ElemType x) //按值删除
{
if (isempty(list))
{
printf( "顺序表为空,不能删除。\n");
return;
}
int pos = find(list,x);
if (pos == -1)
{
printf("未找到该数。\n");
return;
}
delete_pos(list,pos);
}
void clear(SeqList *list) //清空
{
list->size = 0;
}
void destory(SeqList *list) //摧毁表
{
list->base = NULL;
}
void reverse(SeqList *list) //逆序
{
for (int i = 0,j = list->size - 1; i < list->size / 2; i++,j--)
{
int temp = list->base[i];
list->base[i] = list->base[j];
list->base[j] = temp;
}
}
//主函数
#include"SeqList.h"
void main()
{
SeqList mylist;
InitList(&mylist);
int select = 1;
ElemType Item;
int pos;
while (select)
{
printf("****************************************************\n");
printf("* [1] show_list [2] quit_system *\n");
printf("* [3] push_front [4] push_back *\n");
printf("* [5] pop_front [6] pop_back *\n");
printf("* [7] insert_pos [8] insert_val *\n");
printf("* [9] delete_pos [10] delete_val *\n");
printf("* [11] find [12] length *\n");
printf("* [13] clear [14] destory *\n");
printf("* [15] reverse(逆序) [16] sort(顺序) *\n");
printf("****************************************************\n");
printf("请选择:");
scanf_s("%d",&select);
switch (select)
{
case 1:
show_list(&mylist);
break;
case 2:
quit_system(&mylist,&select);
break;
case 3:
printf("请输入要插入的值(-1结束):>");
while (scanf_s("%d",&Item),Item != -1)
{
push_front(&mylist,Item);
}
break;
case 4:
printf("请输入要插入的值(-1结束):>");
while (scanf_s("%d",Item != -1)
{
push_back(&mylist,Item);
}
break;
case 5:
pop_front(&mylist);
break;
case 6:
pop_back(&mylist);
break;
case 7:
printf("请输入要插入的位置:");
scanf_s("%d",&pos);
printf("请输入要插入的值:");
scanf_s("%d",&Item);
insert_pos(&mylist,Item,pos);
break;
case 8:
printf("请输入要插入的数:");
scanf_s("%d",&Item);
insert_val(&mylist,Item);
break;
case 9:
printf("请输入要删的位置:");
scanf_s("%d",&pos);
delete_pos(&mylist,pos);
break;
case 10:
printf("请输入要删的值:");
scanf_s("%d",&Item);
delete_val(&mylist,Item);
break;
case 11:
printf("请输入要查找的数:");
scanf_s("%d",&Item);
pos=find(&mylist,Item);
if (pos != -1)
{
printf("该数为第%d个数.\n",pos);
}
else
printf("未找到该数。\n");
break;
case 12:
printf("该顺序表长度为:%d\n",length(&mylist));
break;
case 13:
clear(&mylist);
break;
case 14:
destory(&mylist);
break;
case 15:
reverse(&mylist);
break;
case 16:
sort(&mylist);
break;
default:
break;
}
}
}
原文链接:https://www.f2er.com/datastructure/382663.html