C语⾔数据结构(实验⼀)基于顺序表的图书馆系统代码如下:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include <stdlib.h>#include<string.h>#include <algorithm>using namespace std;//排序函数#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define MAXSIZE 1000//图表可能达到的最⼤长度//定义图书表的顺序储存结构//定义图书信息typedef struct{char no[20];//ISBNchar name[50];//书名float price;//价格}Book;typedef struct node//⽤于链表去重{long long int no;char name[50];double price;struct node* next;} Book1, * BookList;//定义顺序储存结构类型typedef struct{Book* elem;//储存空间基地址int length;//当前图书个数typedef int Status;typedef int ElemType;//初始化⼀个顺序表Status InitList_Sq(SqList &L){L.elem = new Book[MAXSIZE];//份配空间if (!L.elem)//分配失败{exit(OVERFLOW);}L.length = 0;//空表长度为0return OK;}//顺序表输⼊Status ListInsert(SqList&L){int i =1;while (1){if (i > MAXSIZE)//输⼊图书信息数超过最⼤值,退出{exit(OVERFLOW);}scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输⼊图书数据if (!strcmp(L.elem[i].no, "0") && !strcmp(L.elem[i].name, "0")&& L.elem[i].price == 0) {break;//输⼊结束标志0 0 0则停⽌输⼊}i++;}L.length = i-1;return i-1;}//顺序表逆序输⼊Status NListInsert(SqList& L){int i,t;scanf("%d", &i);while (1){if (i > MAXSIZE)//输⼊图书信息数超过最⼤值,退出{exit(OVERFLOW);}if (i == 0)//结束输⼊{break;}scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输⼊图书数据i--;}L.length = t;return L.length;}//顺序表输出Status ListOutput(SqList& L){for (int i = 1; i <= L.length; i++){printf("%s %s %.2f\n", L.elem[i].no, L.elem[i].name, L.elem[i].price);//输出图书信息表}return OK;}//顺序表排序bool cmp(Book L1, Book L2)//按照价格降序排序{if (L1.price > L2.price){return true;}else{return false;}}Status SqSort(SqList& L)sort(&(L.elem[1]), &(L.elem[L.length + 1]), cmp);return OK;}//顺序表修改价格Status Sqprice(SqList& L){float avg = 0;//平均价格for (int i = 1; i <= L.length; i++){avg += L.elem[i].price;//计算所有书的总价格}avg /= L.length;//所有书的平均价格=总价/书本数量for (int i = 1; i <= L.length; i++){if (L.elem[i].price >= avg)//⾼于或等于平均价格的图书价格提⾼ 10% {L.elem[i].price *= 1.1;}else if (L.elem[i].price < avg)//低于平均价格的图书价格提⾼20%{L.elem[i].price *= 1.2;}}printf("%.2f\n", avg);//输出平均价格return OK;}//顺序表找最贵的书Status SqMax(SqList& L){int n;//图书数⽬printf("请输⼊数据:\n");scanf("%d", &n);//输⼊图书数⽬InitList_Sq(L); //初始化线性表L.length = n;//给线性表中的图书数⽬赋值if (n<1 || n>MAXSIZE)return OK;int i = 1;while (i <= n)scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输⼊图书信息表i++;}int maxprice[MAXSIZE];//最贵图书在线性表中的编号int len = 0, max = 0;//len:最贵图书的数⽬ max:最贵图书价格for (int i = 1; i <= n; i++)//查找最贵图书并记录其在线性表中的编号{if (L.elem[i].price > max)//找到更贵的图书{len = 1;//更贵图书的数⽬记为1maxprice[len] = i;//记录更贵图书在线性表中的编号max = L.elem[i].price;//修改最贵图书价格}else if (max == L.elem[i].price)//找到下⼀本最贵图书{len++;//最贵图书的数⽬加1maxprice[len] = i;//记录更贵图书在线性表中的编号}}printf("%d\n", len);//输出最贵图书的数⽬for (int i = 1; i <= len; i++)//输出最贵图书的信息{int j;j = maxprice[i];printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//根据编号输出最贵图书的信息}return OK;}//顺序表找出最喜爱的书Status SqFavor(SqList& L){int n;//图书数量int i, j;Book b[MAXSIZE];printf("请输⼊数据\n");scanf("%d", &n);for (i = 0; i < n; i++)scanf("%s %s %f", &b[i].no, &b[i].name, &b[i].price); }int m,t;//查找m次scanf("%d", &m);Book b_1[MAXSIZE];for (int k = 0; k < m; k++){scanf("%s", &b_1[k].name);}for (int k = 0; k < m; k++){t = 0;for (j = 0; j < i; j++){if (!strcmp(b_1[k].name, b[j].name)){t++;}}if (t == 0){printf("抱歉,这⾥没有你的最爱!\n");}else{printf("%d\n", t);for (j = 0; j < i; j++){if (!strcmp(b_1[k].name, b[j].name)){printf("%s %s %.2f\n", b[j].no, b[j].name, b[j].price); }}}}return OK;}//顺序表图书位置查找{int n;//图书数量int i, j;Book b[MAXSIZE];printf("请输⼊数据\n");scanf("%d", &n);for (i = 1; i <= n; i++){scanf("%s %s %f", &b[i].no, &b[i].name, &b[i].price); }int m;//查找m次scanf("%d", &m);int b_1[MAXSIZE];for (int k = 0; k < m; k++){scanf("%d", &b_1[k]);}for (int k = 0; k < m; k++){for (j = 1; j <= n; j++){if (b_1[k]== j)//对应位置并输出{printf("%s %s %.2f\n", b[j].no, b[j].name, b[j].price); }}if (b_1[k]>i||b_1[k]<1)//位置不存在{printf("抱歉,最佳位置上的图书不存在!\n");}}return OK;}//顺序表新书⼊库Status SqEnter(SqList& L){int n, j,i;Book in_b;for (j = 1; j <= n; j++){scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);}L.length = n;scanf("%d", &i);if ((i < 1) || (i > L.length + 1)|| (i == MAXSIZE)){printf("抱歉,⼊库位置⾮法!\n");//i值不合法return ERROR;}else{scanf("%s %s %f", &in_b.no,&in_,&in_b.price);for ( j = L.length; j >= i ; j--){L.elem[j + 1] = L.elem[j];//插⼊位置及之后的元素右移}L.elem[i] = in_b;//将新元素e放⼊第i个位置++L.length;//表长加1for ( j = 1; j<= L.length; j++){printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表}return OK;}}//顺序表旧书出库Status SqDelete(SqList& L){int n, j, i;printf("请输⼊数据\n");scanf("%d", &n);for (j = 1; j <= n; j++){scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);}if ((i < 1) || (i > L.length)){printf("抱歉,出库位置⾮法!\n");//i值不合法return ERROR;}else{for (j = i + 1; j <= n; j++){L.elem[j - 1] = L.elem[j];//删除位置及之后的元素左移}--L.length;//表长减1for (j = 1; j <= L.length; j++){printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表}return OK;}}//顺序表去重Status SqRepeat(SqList& L){int n, j, i,t;printf("请输⼊数据\n");scanf("%d", &n);for (j = 1; j <= n; j++)//输⼊{scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);}L.length = n;for (i = 1; i <= n; i++)//书号循环对⽐{for (j = i + 1; j <= n; j++){if (!strcmp(L.elem[i].no, L.elem[j].no))//重复删除{for (t = j+ 1; t <= n; t++)L.elem[t - 1] = L.elem[t];//删除位置及之后的元素左移}--n;//表长减1--j;}}}printf("%d\n", n);for (j = 1; j <= n; j++){printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表}return OK;}//定义链式储存结构类型typedef struct LNODE{Book elem;//数据域LNODE* next;//指针域}LNODE, * LinkList;//初始化链表Status Init(LinkList L){L = (LinkList)malloc(sizeof(LNODE));//分配结点空间if (!L){exit(OVERFLOW);//空间分配失败,退出}L->next = NULL;//下⼀本书的地址为空return OK;//空间分配完成}//链表输出数⽬Status LNum(LinkList L){LinkList r = L; //输⼊int i;for (i = 0; i < MAXSIZE; i++) {scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price);if (!(strcmp(p->elem.no, "0")) && !(strcmp(p->, "0")) && p->elem.price == 0) { break;}p->next = NULL;r->next = p;r = p;}if (i)printf("%d\n", i);else//异常return OK;LinkList p = L->next;//输出while (p != NULL){printf("%s %s %.2f\n", p->elem.no, p->, p->elem.price);p = p->next;}return OK;}//链表输⼊ (后插)Status Insert(LinkList& L){LinkList r = L; //尾指针r指向头结点int i;for (i = 1; i <= MAXSIZE; i++) {LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price);if (!(strcmp(p->elem.no, "0")) && !(strcmp(p->, "0")) && p->elem.price == 0) { break;}p->next = NULL;r->next = p;r = p;}return OK;}//链表输出Status Loutput(LinkList L)LinkList p = L->next;while (p != NULL){printf("%s %s %.2f\n", p->elem.no, p->, p->elem.price);p = p->next;}return OK;}//链表排序Status Lsort(LinkList L){if (L->next == NULL || L->next->next == NULL)//线性表⽆元素或只有⼀个元素,⽆需排序{return OK;}LinkList pre = L;//操作结点的前⼀个结点LinkList now = L->next;//操作结点LinkList tail = NULL; //尾结点while (L->next != tail)//冒泡排序{pre = L;now = L->next;int flag = 0;while (now->next != tail){if (now->elem.price < now->next->elem.price){flag = 1;pre->next = now->next;now->next = now->next->next;pre->next->next = now;pre = pre->next;}else{pre = pre->next;now = now->next;}if (flag == 0){break;}else{tail = now;}}return OK;}//链表提⾼图书价格Status Lprice(LinkList& L){int num = 0;//图书数量float avg = 0;//图书平均价格LinkList p = L->next;while (p != NULL)//遍历线性表{avg += p->elem.price;//计算图书总价num++;//统计图书数量p = p->next;}avg /= num;//图书均价=总价/图书数量p = L->next;while (p != NULL){if (p->elem.price >= avg){p->elem.price *= 1.1;//所有⾼于或等于平均价格的图书价格提⾼10% }else if (p->elem.price < avg){p->elem.price *= 1.2;//所有低于平均价格的图书价格提⾼20%}p = p->next;}printf("%.2f\n", avg);//输出图书均价//链表逆序输出(头插)Status NInsert(LinkList& L){int n,i;scanf("%d", &n);LinkList p = L;for (i = 1; i <=n; i++)//输⼊{LinkList r = new LNODE;scanf("%s %s %f", &r->elem.no, &r->, &r->elem.price);r->next = p->next;p->next = r;}p = p->next;for (i=1; i <= n; i++)//输出{printf("%s %s %.2f\n", p->elem.no, p->, p->elem.price);p = p->next;}return OK;}//链表最贵图书Status Lexpensive(LinkList& L){int n, i, m, k;LinkList r = L;scanf("%d", &n);for (i = 0; i < n; i++) //后插输⼊{LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price);p->next = NULL;r->next = p;r = p;}if (L->next == NULL || L->next->next == NULL)//线性表⽆元素或只有⼀个元素,⽆需排序{LinkList pre = L;//操作结点的前⼀个结点LinkList now = L->next;//操作结点LinkList tail = NULL; //尾结点while (L->next != tail)//冒泡排序{pre = L;now = L->next;int flag = 0;while (now->next != tail){if (now->elem.price < now->next->elem.price) {flag = 1;pre->next = now->next;now->next = now->next->next;pre->next->next = now;pre = pre->next;}else{pre = pre->next;now = now->next;}}if (flag == 0){break;}else{tail = now;}}LinkList p = L->next;int max = p->elem.price;i = 0;while (p->elem.price == max){i++;p = p->next;}printf("%d\n", i);while (p)p = p->next;p = L->next;while (p->elem.price==max){printf("%s %s %.2f\n", p->elem.no, p->, p->elem.price); p = p->next;}return OK;}//链表最爱图书Status LFavor(LinkList& L){int n, i,m,k,t;scanf("%d", &n);LinkList p = L;for (i = 1; i <= n; i++)//输⼊{LinkList r = new LNODE;scanf("%s %s %f", &r->elem.no, &r->, &r->elem.price); r->next = NULL;p->next = r;p = r;}scanf("%d", &k);//输⼊查找数⽬//输⼊查找书名Book a[MAXSIZE];for(i=0;i<k;i++){scanf("%s", &a[i].name);}for (i = 0; i < k; i++){//遍历查找计算符合条件的书数量m = 0;LinkList now = L->next;//操作结点while (now->next){if (!strcmp(now->, a[i].name)){m++;now = now->next;}elsenow = now->next;}//输出数量if(m)printf("%d\n", m);else//未找到printf("抱歉,没有你的最爱!\n");//输出图书信息now = L->next;while (now->next){if (!strcmp(now->, a[i].name)){printf("%s %s %.2f\n", now->elem.no, now->, now->elem.price); break;}elsenow = now->next;}}return OK;}//链表最爱位置Status LPlace(LinkList L){int n, i,m,k;LinkList r = L;scanf("%d", &n);for (i = 0; i < n; i++) //后插输⼊{LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price); p->next = NULL;r->next = p;r = p;}LinkList p = L->next;int b_1[MAXSIZE];scanf("%d", &m);//查找m次for (k = 0; k < m; k++)//输⼊位置{scanf("%d", &b_1[k]);}for (k = 0; k < m; k++)//分别查找位置{if (b_1[k]<1 || b_1[k]>n)//位置不合法printf("抱歉,最佳位置上的图书不存在!\n");else{for (i = 1; i < b_1[k]; i++){p = p->next;}printf("%s %s %.2f\n", p->elem.no, p->, p->elem.price); }}return OK;}//链表新书⼊库Status LNew(LinkList L){int n, i, m, k;LinkList r = L;scanf("%d", &n);for (i = 0; i < n; i++) //后插输⼊{LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price); p->next = NULL;r->next = p;r = p;}scanf("%d", &k);if (k>n+1||k<1)printf("抱歉,⼊库位置⾮法!\n");else{LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price); r = L->next;for (i = 1; i < k - 1; i++){r = r->next;}p->next = r->next;r->next = p;Loutput(L);}return OK;}//链表旧书出库Status LOld(LinkList L){int n, i, m, k;LinkList r = L;scanf("%d", &n);for (i = 0; i < n; i++) //后插输⼊{LinkList p = new LNODE;scanf("%s %s %f", &p->elem.no, &p->, &p->elem.price); p->next = NULL;r->next = p;r = p;}scanf("%d", &k);if (k > n || k < 1)printf("抱歉,出库位置⾮法!\n");else{r = L->next;for (i = 1; i < k - 1; i++){r = r->next;}r->next = r->next->next;Loutput(L);}return OK;}int main(){int a;printf("你想查看问题⼏的结果?(请输⼊数字):\n"); scanf("%d", &a);if (a > 0 && a < 11){switch (a){case 1:{//顺序表的创建和输出SqList L;InitList_Sq(L);printf("请输⼊数据:\n");int i;i = ListInsert(L);printf("%d\n", i);ListOutput(L);break;}case 2:{//顺序表的排序(从⾼到低)SqList L;InitList_Sq(L);printf("请输⼊数据:\n");ListInsert(L);SqSort(L);case 3:{//顺序表修改价格SqList L;InitList_Sq(L);printf("请输⼊数据:\n"); ListInsert(L);Sqprice(L); ListOutput(L); break;}case 4:{//顺序表逆序存储SqList L;InitList_Sq(L);printf("请输⼊数据:\n"); NListInsert(L); ListOutput(L); break;}case 5:{//找出最贵的书SqList L;SqMax(L);break;}case 6:{//最爱图书查找SqList L;InitList_Sq(L); SqFavor(L);break;}case 7:case 8:{//新图书的⼊库SqList L;InitList_Sq(L);SqEnter(L);break;}case 9:{//旧书出库SqList L;InitList_Sq(L);SqDelete(L);break;}case 10:{//去重SqList L;InitList_Sq(L);SqRepeat(L);break;}}}if (a > 10 && a < 21){//链表printf("请输⼊数据:\n");switch (a){case 11:{//创建输出链表LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);{//链表排序LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);Insert(L);Lsort(L);Loutput(L);break;}case 13:{//链表修改价格LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);Insert(L);Lprice(L);Loutput(L);break;}case 14:{//链表逆序输出LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);NInsert(L);break;}case 15:{//链表最贵图书LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);Lexpensive(L);break;}L = (LinkList)malloc(sizeof(LNODE)); Init(L);LFavor(L);break;}case 17:{//链表最爱位置LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);LPlace(L);break;}case 18:{//链表新书⼊库LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);LNew(L);break;}case 19:{//链表旧书出库LinkList L;L = (LinkList)malloc(sizeof(LNODE)); Init(L);LOld(L);break;}case 20:{//链表去重int n;scanf("%d", &n);BookList L;Book1* p, * q, * rear;L = (Book1*)malloc(sizeof(Book));while (n--)//输⼊{p = (Book1*)malloc(sizeof(Book));scanf("%lld %s %lf", &p->no, p->name, &p->price); rear->next = p;rear = p;}rear->next = NULL;p = L;while (p->next)//查找重复并删除{int flag = 1;q = L->next;while (q != p->next){if (q->no == p->next->no){q = p->next;p->next = q->next;L->no--;free(q);flag = 0;break;}q = q->next;}if (flag == 1)p = p->next;}printf("%d\n", L->no);p = L->next;while (p)//输出{printf("%lld %s %.2f\n", p->no, p->name, p->price); p = p->next;}} return 0; }。