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];//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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM