//创建静态线性表
typedef int DataType;
typedef struct SeqList
{
DataType a[MAX];
int size;
}SeqList;
//初始化——置空顺序表
void SQList_Init(SeqList* p)
{
p->size = 0;
}
//创建一个顺序表
void SQList_Create(SeqList* p)
{
int n,i;
printf("请输入元素的个数>\n");
scanf("%d", &n);
printf("请依次输入元素>\n");
for (i = 0; i < n; i++)
{
scanf("%d", &p->a[i]);
p->size++;
}
printf("\n");
}
//打印顺序表各结点的值
void SQList_Print(SeqList* p)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
printf("%-3d", p->a[i]);
}
printf("\n");
}
//头插
void SQList_PushFront(SeqList* p,DataType x)
{
int i;
if (p ->size == MAX)
{
printf("顺序表是满的!\n");
exit(-1);
}
for (i = p->size; i >= 0; i--)
{
p->a[i] = p->a[i - 1];
}
p -> a[0] = x;
p->size++;
}
//尾插
void Push_Back_SQList(SeqList* p,DataType x)
{
if (p->size == MAX)
{
printf("顺序表是满的!\n");
exit(-1);
}
p->a[p->size] = x;
p->size++;
}
//头删
void SQList_Pop_Front(SeqList* p)
{
int i;
if (p->size == 0)
{
printf("顺序表是空的!\n");
exit(-1);
}
for (i = 1; i >= 0; i--)
{
p->a[i - 1] = p->a[i];
}
p->size--;
printf("\n");
}
//尾删
void SQList_Pop_Back(SeqList* p)
{
p->size--;
//查找第i个节点的值(0,1...p->size-1)
DataType SeqList_Get(SeqList* p,int i)
{
if (i < 0 || i >= p->size)
{
printf("指定位置的结点不存在~\n");
exit(-1);
}
return p ->a[i];
}
//查找值为x的结点
void SeqList_Find(SeqList* p,DataType x)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (p->a[i] == x)
{
printf("找到了!\n");
printf("下标为%d", i);
}
}
}
//查找第i个节点的值
printf("------查找第i个节点的值------\n");
printf("请输入查找的结点\n");
int i;
scanf("%d", &i);
printf("\n第%d个结点的值为%d\n", i,SeqList_Get(&s, i));
//查找值为a的结点
printf("------查找值为a的结点------\n");
int a;
printf("请输入要查找的值>\n");
scanf("%d", &a);
SeqList_Find(&s, a);
//插入—— 在第i个位置添加元素x
void SeqList_Insert(SeqList* p, int i, DataType x)
{
int j;
if (i <= 0 || i >= p->size)
{
printf("插入位置不在范围内!\n");
exit(-1);
}
if (p->size == MAX)
{
printf("线性表已满!\n");
exit(-1);
}
for (j = p->size; j > i; j--)
p->a[j] = p->a[j-1];
p->a[i] = x;
p->size++;
}
//插入—— 在第i个位置添加元素x
void SeqList_Insert(SeqList* p, int i, DataType x)
{
int j;
if (i <= 0 || i >= p->size)
{
printf("插入位置不在范围内!\n");
exit(-1);
}
if (p->size == MAX)
{
printf("线性表已满!\n");
exit(-1);
}
for (j = p->size; j > i; j--)
p->a[j] = p->a[j-1];
p->a[i] = x;
p->size++;
}
void SeqList_Dele(SeqList* p,int pos)
{
if (p->size == 0)
{
printf("顺序表是空的!\n");
exit(-1);
}
if (pos < 0 || pos >= p->size)
{
printf("指定删除的位置不存在!\n");
exit(-1);
}
int i;
for (i = pos; i < p->size - 1; i++)
p->a[i] = p->a[i + 1];
p->size--;
}
//删除顺序表中position位置的结点
printf("请输入要删除结点的位置:\n");
int pos = 0;
scanf("%d", &pos);
SeqList_Dele(&s, pos);
SQList_Print(&s);//打印线性表
//顺序表倒置
void SeqList_Inverse(SeqList* p)
{
int i,j,tmp;
for (i = 0,j=p->size-1; i < p->size / 2; i++,j--)
{
tmp = p->a[i];
p->a[i] = p->a[j];
p->a[j] = tmp;
}
}
//顺序表倒置
SeqList_Inverse(&s);
SQList_Print(&s);//打印元素
//求顺序表中值为x的结点的个数
int SeqList_Find_X(SeqList* p,DataType x)
{
int i = 0,count=0;
for (i = 0; i < p->size; i++)
{
if (p->a[i] == x)
count++;
}
return count;
}
//求顺序表中值为x的结点的个数
int X,count;
printf("请输入要查找的值:\n");
scanf("%d", &X);
count = SeqList_Find_X(&s, X);
printf("顺序表中值为x的结点的个数为%d", count);
SeqList.c:编写实现各种功能的函数。
SeqList.h:头文件,包含需要的头文件和结构体的声明异界函数的声明。
test.c:用来测试,主要在主函数中调用函数。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 100
#include
#include
//创建静态线性表
typedef int DataType;
typedef struct SeqList
{
DataType a[MAX];
int size;
}SeqList;
//函数声明
void SQList_Init(SeqList* p);
void SQList_Create(SeqList* p);
void SQList_Print(SeqList* p);
void SQList_PushFront(SeqList* p, DataType x);
void Push_Back_SQList(SeqList* p, DataType x);
void SQList_Pop_Front(SeqList* p);
void SQList_Pop_Back(SeqList* p);
DataType SeqList_Get(SeqList* p, int i);
void SeqList_Find(SeqList* p, DataType x);
void SeqList_Insert(SeqList* p, int i, DataType x);
void SeqList_Inverse(SeqList* p);
void SeqList_Dele(SeqList* p, int pos);
int SeqList_Find_X(SeqList* p, DataType x);
#include "SeqList.h"
//初始化——置空顺序表
void SQList_Init(SeqList* p)
{
p->size = 0;
}
//创建一个顺序表
void SQList_Create(SeqList* p)
{
int n,i;
printf("请输入元素的个数>\n");
scanf("%d", &n);
printf("请依次输入元素>\n");
for (i = 0; i < n; i++)
{
scanf("%d", &p->a[i]);
p->size++;
}
printf("\n");
}
//打印顺序表各结点的值
void SQList_Print(SeqList* p)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
printf("%-3d", p->a[i]);
}
printf("\n");
}
//头插
void SQList_PushFront(SeqList* p,DataType x)
{
int i;
if (p ->size == MAX)
{
printf("顺序表是满的!\n");
exit(-1);
}
for (i = p->size; i >= 0; i--)
{
p->a[i] = p->a[i - 1];
}
p -> a[0] = x;
p->size++;
}
//尾插
void Push_Back_SQList(SeqList* p,DataType x)
{
if (p->size == MAX)
{
printf("顺序表是满的!\n");
exit(-1);
}
p->a[p->size] = x;
p->size++;
}
//头删
void SQList_Pop_Front(SeqList* p)
{
int i;
if (p->size == 0)
{
printf("顺序表是空的!\n");
exit(-1);
}
for (i = 1; i >= 0; i--)
{
p->a[i - 1] = p->a[i];
}
p->size--;
printf("\n");
}
//尾删
void SQList_Pop_Back(SeqList* p)
{
p->size--;
}
//查找
//查找第i个节点的值(0,1...p->size-1)
DataType SeqList_Get(SeqList* p,int i)
{
if (i < 0 || i >= p->size)
{
printf("指定位置的结点不存在~\n");
exit(-1);
}
return p ->a[i];
}
//查找值为x的结点
void SeqList_Find(SeqList* p,DataType x)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (p->a[i] == x)
{
printf("找到了!\n");
printf("下标为%d", i);
}
}
}
//插入—— 在第i个位置添加元素x
void SeqList_Insert(SeqList* p, int i, DataType x)
{
int j;
if (i <= 0 || i >= p->size)
{
printf("插入位置不在范围内!\n");
exit(-1);
}
if (p->size == MAX)
{
printf("线性表已满!\n");
exit(-1);
}
for (j = p->size; j > i; j--)
p->a[j] = p->a[j-1];
p->a[i] = x;
p->size++;
}
void SeqList_Dele(SeqList* p,int pos)
{
if (p->size == 0)
{
printf("顺序表是空的!\n");
exit(-1);
}
if (pos < 0 || pos >= p->size)
{
printf("指定删除的位置不存在!\n");
exit(-1);
}
int i;
for (i = pos; i < p->size - 1; i++)
p->a[i] = p->a[i + 1];
p->size--;
}
//顺序表倒置
void SeqList_Inverse(SeqList* p)
{
int i,j,tmp;
for (i = 0,j=p->size-1; i < p->size / 2; i++,j--)
{
tmp = p->a[i];
p->a[i] = p->a[j];
p->a[j] = tmp;
}
}
//求顺序表中值为x的结点的个数
int SeqList_Find_X(SeqList* p,DataType x)
{
int i = 0,count=0;
for (i = 0; i < p->size; i++)
{
if (p->a[i] == x)
count++;
}
return count;
}
#include "SeqList.h"
int main()
{
SeqList s;//创建线性表变量
SQList_Init(&s);//初始化
SQList_Create(&s);//创建一个线性表
SQList_Print(&s);//打印元素
//头插
printf("------头插------\n");
printf("请输入要头插的元素>\n");
int x;
scanf("%d", &x);
SQList_PushFront(&s, x);
SQList_Print(&s);//打印头插之后的线性表
//尾插
printf("------尾插------\n");
int y;
printf("请输入要尾插的元素>\n");
scanf("%d", &y);
Push_Back_SQList(&s,y);
SQList_Print(&s);//打印尾插之后的线性表
//头删
printf("------头删------\n");
SQList_Pop_Front(&s);
SQList_Print(&s);//打印头删之后的线性表
//尾删
printf("------尾删------\n");
SQList_Pop_Back(&s);
SQList_Print(&s);//打印尾之后删的线性表
//查找第i个节点的值
printf("------查找第i个节点的值------\n");
printf("请输入查找的结点\n");
int i;
scanf("%d", &i);
printf("\n第%d个结点的值为%d\n", i,SeqList_Get(&s, i));
//查找值为a的结点
printf("------查找值为a的结点------\n");
int a;
printf("请输入要查找的值>\n");
scanf("%d", &a);
SeqList_Find(&s, a);
//插入—— 在第j个位置添加元素x
int j;
int b;
printf("\n请输入要插入的位置>\n");
scanf("%d", &j);
printf("请输入要插入的元素>\n");
scanf("%d", &b);
SeqList_Insert(&s, j, b);
SQList_Print(&s);//打印元素
//删除顺序表中position位置的结点
printf("请输入要删除结点的位置:\n");
int pos = 0;
scanf("%d", &pos);
SeqList_Dele(&s, pos);
SQList_Print(&s);//打印线性表
//顺序表倒置
SeqList_Inverse(&s);
SQList_Print(&s);//打印元素
//求顺序表中值为x的结点的个数
int X,count;
printf("请输入要查找的值:\n");
scanf("%d", &X);
count = SeqList_Find_X(&s, X);
printf("顺序表中值为x的结点的个数为%d", count);
return 0;
}