代碼如下:
#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];//ISBN
char 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;//當前圖書個數
}SqList;
typedef int Status;
typedef int ElemType;
//初始化一個順序表
Status InitList_Sq(SqList &L)
{
L.elem = new Book[MAXSIZE];//份配空間
if (!L.elem)//分配失敗
{
exit(OVERFLOW);
}
L.length = 0;//空表長度為0
return 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);
t = 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;//更貴圖書的數目記為1
maxprice[len] = i;//記錄更貴圖書在線性表中的編號
max = L.elem[i].price;//修改最貴圖書價格
}
else if (max == L.elem[i].price)//找到下一本最貴圖書
{
len++;//最貴圖書的數目加1
maxprice[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;
}
//順序表圖書位置查找
Status SqPlace(SqList& L)
{
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;
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;
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_b.name,&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;//表長加1
for ( 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);
}
L.length = n;
scanf("%d", &i);
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;//表長減1
for (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++) {
LinkList p = new LNODE;
scanf("%s %s %f", &p->elem.no, &p->elem.name, &p->elem.price);
if (!(strcmp(p->elem.no, "0")) && !(strcmp(p->elem.name, "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->elem.name, 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->elem.name, &p->elem.price);
if (!(strcmp(p->elem.no, "0")) && !(strcmp(p->elem.name, "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->elem.name, 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);//輸出圖書均價
return OK;
}
//鏈表逆序輸出(頭插)
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->elem.name, &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->elem.name, 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->elem.name, &p->elem.price);
p->next = NULL;
r->next = p;
r = p;
}
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;
}
}
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->elem.name, 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->elem.name, &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->elem.name, a[i].name))
{
m++;
now = now->next;
}
else
now = now->next;
}
//輸出數量
if(m)
printf("%d\n", m);
else//未找到
printf("抱歉,沒有你的最愛!\n");
//輸出圖書信息
now = L->next;
while (now->next)
{
if (!strcmp(now->elem.name, a[i].name))
{
printf("%s %s %.2f\n", now->elem.no, now->elem.name, now->elem.price);
break;
}
else
now = 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->elem.name, &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->elem.name, 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->elem.name, &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->elem.name, &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->elem.name, &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);
ListOutput(L);
break;
}
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:
{//圖書位置查找
SqList L;
InitList_Sq(L);
SqPlace(L);
break;
}
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);
LNum(L);
break;
}
case 12:
{//鏈表排序
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;
}
case 16:
{//鏈表最愛圖書
LinkList L;
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));
L->no = n;
L->next = NULL;
rear = L;
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;
}
break;
}
}
}
return 0;
}