#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//顺序表大小
#define MAXSIZE 5
//顺序表结点结构体
typedef struct {
char Name[40];
char Author[40];
char Source[40];
int Prize;
}BookNode;
//顺序表结构体
typedef struct {
BookNode* ListPointer;
int Length;
}Book;
//定义顺序表初始化函数
Book* initList(Book* L) {
//为顺序表分配内存空间
L = (Book*)malloc(sizeof(Book));
L->ListPointer = (BookNode*)malloc(MAXSIZE * sizeof(BookNode));
//分配内存失败返回-1作为标记
if (L->ListPointer == NULL)
return NULL;
//分配成功,初始化顺序表当前已存储数据个数,并返回1作为标记
else {
L->Length = 0;
}
return L;
}
//定义向顺序表录入数据函数,Num为要录入的数据数量
int inputData(Book* L, int Num) {
printf("#########################\n");
printf(" 向顺序表录入数据\n");
printf("#########################\n");
//循环录入Num个学生的信息
for (int i = 0; i < Num; i++) {
//判断存储区是否满
if (L->Length >= MAXSIZE) {
printf("存储区满\n");
//返回-1标记缓冲区满,没有完成所有数据录入
return -1;
}
printf("请录入第%d本图书的书名:", L->Length + 1);
scanf("%c%[^\n]", &L->ListPointer[L->Length].Name);
printf("请录入第%d本图书的作者:", L->Length + 1);
scanf("%c%[^\n]", &L->ListPointer[L->Length].Author);
printf("请录入第%d本图书的出版社:", L->Length + 1);
scanf("%c%[^\n]", &L->ListPointer[L->Length].Source);
printf("请录入第%d本图书的价格:", L->Length + 1);
scanf("%d", &L->ListPointer[L->Length].Prize);
L->Length++;
}
return 1;
}
//打印顺序表所有数据
void dispList(Book* L) {
printf("\n#########################\n");
printf(" 打印顺序表所有数据\n");
printf("#########################\n");
//根据顺序表记录的数据数量依次打印所有数据
for (int i = 0; i < L->Length; i++) {
printf("第%d本书的书名:%s\n", i + 1, L->ListPointer[i].Name);
printf("第%d本书的作者:%s\n", i + 1, L->ListPointer[i].Author);
printf("第%d本书的出版社:%s\n", i + 1, L->ListPointer[i].Source);
printf("第%d本书的价格:%d\n", i + 1, L->ListPointer[i].Prize);
}
}
//查找函数
int LocateElem(Book* L, char name)
{
printf("\n#########################\n");
printf("查找书名为%s的图书\n", name);
printf("###########################\n");
//遍历顺序表找学生
for (int i = 0; i < L->Length; i++) {
if (L->ListPointer[i].Name[40] == name) {
printf("查找到书名为 %s的图书,序号为%d\n", name, i + 1);
return i + 1;
}
printf("未找到书名为%s的图书\n", name);
}
//没找到该学生
printf("未找到书名为%s的图书\n", name);
return -1;
}
//删除函数
int ListDelete(Book* L, int p, int t) {
printf("\n#########################\n");
printf(" 删除第%d个图书数据\n", p);
printf("#########################\n");
if (p < 0 || p > L->Length) {
printf("删除第一个位置非法\n");
return -1;
}
for (int i = p; i <= L->Length; i++)
{
L->ListPointer[i - 1] = L->ListPointer[i];
}
L->Length--;
printf("删除第一个成功\n");
if (t< 0 || t > L->Length) {
printf("删除第二个位置非法\n");
return -1;
}
for (int n = p; n <= L->Length; n++)
{
L->ListPointer[n - 1] = L->ListPointer[n];
}
L->Length--;
printf("删除第二个成功\n");
return 1;
}
//插入函数
int listInsert(Book* L, int p, BookNode* SN)
{
printf("# # # # # # #\n");
printf("在第%d个图书后插入数据\n", p);
printf("# # # # # # #\n");
if (p<0 || p>L->Length)
{
printf("插入位置非法\n");
return -1;
}
for (int i = L->Length; i > p; i--) {
L->ListPointer[i] = L->ListPointer[i - 1];
}
strcpy(L->ListPointer[p].Name, SN->Name);
strcpy(L->ListPointer[p].Author, SN->Author);
strcpy(L->ListPointer[p].Source, SN->Source);
L->ListPointer[p].Prize = SN->Prize;
L->Length++;
printf("插入成功\n");
return 1;
}
int main(int argc, char* argv[]) {
//定义学生顺序表指针
Book* Bookptr = NULL;
//初始化学生顺序表
Bookptr = initList(Bookptr);
//向学生顺序表录入5组数据
inputData(Bookptr, 5);
//打印顺序表所有数据
dispList(Bookptr);
//找ID为1003的学生,并输出姓名和位置
LocateElem(Bookptr, '书3');
//删除第1,3个学生信息
ListDelete(Bookptr, 1, 3);
//在第2,4个学生后插入新学生信息
BookNode* BookNode2 = (BookNode*)malloc(sizeof(BookNode));
BookNode2 = NULL;
strcpy(BookNode2->Name, "书1");
strcpy(BookNode2->Author, "张");
strcpy(BookNode2->Source, "出版社1");
BookNode2->Prize = 65;
listInsert(Bookptr, 2, BookNode2);
//打印顺序表所有数据
dispList(Bookptr);
BookNode* BookNode3 = (BookNode*)malloc(sizeof(BookNode));
BookNode3 = NULL;
strcpy(BookNode3->Name, "书2");
strcpy(BookNode3->Author, "李");
strcpy(BookNode3->Source, "出版社2");
BookNode3->Prize = 65;
listInsert(Bookptr, 4, BookNode3);
//打印顺序表所有数据
dispList(Bookptr);
free(Bookptr);
return 0;
}