1. 程式人生 > >用C語言寫的一個順序表

用C語言寫的一個順序表

//自己寫的順序表的實現方式
/**********需求************
***************************
模擬一種場景,圖書管理系統
***************************
Function:
    增add_book()
    刪delete_book()
    改modify_book()
    查check_book()
***************************
        實現吧!
***************************/
#include<stdio.h>//裡面包括標準的輸入輸出,以及perror("fail to open")這樣的用法
#include<string.h>
#define COUNT_SIZE 120 //此處為符號常量,注意這裡沒有分號,也可以用typedef定義,只能為型別的定義;
#define OK 0
#define ERROR 1
typedef char string[20];
//定義一組資料型別
struct book{
    int number;        //圖書編號
    int count;        //圖書數量
    int price;        //圖書價格
    string name;    //圖書名稱
};
struct list{
    struct book Book[COUNT_SIZE];//定義順序表要儲存的資料,也可以是簡單的int型別或者char,float,double等基本資料型別
    int length;
};

typedef struct list List;//為結構體struct list 取一個別名List
//定義以下操作名稱,為什麼有的要加*指標操作符,因為這些操作將要修改資料的結構,所以需要傳地址
void init(List *L);//初始化操作
int add_book(List *L);//增加一本書
int delete_book(List *L);//刪除一本書,
int modify_book(List *L);//修改書的屬性
int is_empty(List L);//判斷書的數量是否為空
int is_full(List L);//判斷書的數量是否達到了極限
int findbookname(List L,string name);//根據書名查詢書籍的位置
int findbooknumber(List L,int num);//根據書的編號查詢書籍的位置
int count_book(List L);//計算出總數
void travel(List L);//遍歷整個順序表

//以下為每個函式的實現
void init(List * L)//初始化函式,使順序表的長度為0
{
    L->length=0;
}

int add_book(List *L)//增加一本書
{

    if(is_full(*L)){
        printf("對不起,數量已經達到了極限,不能再繼續新增");
        return ERROR;
    }

    printf("輸入要新增書籍的名稱:");
    scanf("%s",&(L)->Book[L->length].name);

    printf("輸入要新增書籍的編號:");
    scanf("%d",&(L)->Book[L->length].number);

    printf("輸入要新增書籍的數量:");
    scanf("%d",&(L)->Book[L->length].count);

    printf("輸入要新增書籍的價格:");
    scanf("%d",&(L)->Book[L->length].price);

    printf("\n新增結束@
[email protected]
\n");
    L->length++;//長度加1
    return OK;
}

int delete_book(List *L)//刪除一本書
{
    int check,num;
    string book_name;
    if(is_empty(*L)){
        printf("書籍為空,無法完成刪除操作@[email protected]\n");
        return ERROR;
    }
set1://標號,goto語句跳轉到這裡
    printf("你想根據1.書籍名稱、還是2.編號刪除?請輸入如下選項:");
    scanf("%d",&check);
    switch(check)
    {
    case 1:
        printf("根據書名來刪除操作");
        scanf("%s",book_name);
        strcpy(L->Book[findbookname(*L,book_name)].name,"");//除錯了好久好久,其中包括了雙引號和單引號以及NULL的區別,
                                                            //NULL表示空指標,空指標不能作為拷貝函式的引數
        L->Book[findbookname(*L,book_name)].count = 0;

        L->Book[findbookname(*L,book_name)].number = 0;
    
        L->Book[findbookname(*L,book_name)].price = 0;

    break;
    case 2:
        printf("根據書的編號來進行操作");
        scanf("%d",&num);
        strcpy(L->Book[findbooknumber(*L,num)].name,"");

        L->Book[findbooknumber(*L,num)].count = 0;

        L->Book[findbooknumber(*L,num)].number = 0;
    
        L->Book[findbooknumber(*L,num)].price = 0;

    break;
    default:
        printf("輸入資料錯誤,重新輸入:");
        goto set1;
    }
    L->length--;
    return OK;

}
int modify_book(List *L)//修改書的屬性
{    
    string name;
    int count;
    int number;
    int price;
    printf("請輸入需要修改的書名:\n");
    scanf("%s",&name);

    printf("請輸入書的數量:\n");
    scanf("%d",&count);
    //printf("%d",findbookname(*L,name));測試下標是否正確
    L->Book[findbookname(*L,name)].count = count;
    printf("請輸入書的編號: \n");
    scanf("%d",&number);

    L->Book[findbookname(*L,name)].number = number;
    printf("請輸入書的價格: \n");
    scanf("%d",&price);

    L->Book[findbookname(*L,name)].price = price;
    printf("請輸入新的名稱: \n");
    scanf("%s",L->Book[findbookname(*L,name)].name);//此處花費我10分鐘時間排錯,我此時如果修改了name,那麼
                                                    //接下來的findbookname()中引數也會變化,所以不對

    printf("修改結束! @
[email protected]
");
    return OK;
}

int check_book(List L)//檢視一本書是否存在
{
    string name;
    if(is_empty(L)){
        printf("書籍為空,無法查詢[email protected]@\n");
        return ERROR;
    }
    printf("請輸入書名");
    scanf("%s",&name);
//    findbookname(L,name)>0?printf("%s存在\n",name):printf("%s不存在\n",name);//等效的三元運算子
    if(findbookname(L,name)<0)//判斷根據書名查詢書的位置,返回書的位置
    {
        printf("%s不存在\n",name);
    }
    else
        printf("%s存在\n",name);
    return OK;
}

int is_empty(List L)//判斷書的數量是否為空
{

    if(L.length<0)
    {
        return ERROR;//返回1
    }
    else
        return OK;//返回0
}

int is_full(List L)//判斷書的數量是否達到了極限
{
    if(L.length == COUNT_SIZE)
        return ERROR;
    else
        return OK;
}

int findbookname(List L,string name)//根據書名查詢書籍的位置
{    
    int times;//記錄查詢的位置
    if(is_empty(L)){
        printf("書籍為空,無法查詢
[email protected]
@\n");
        return ERROR;
    }
    for(times = --L.length; times >= 0;times--)
    {
        if(strcmp(L.Book[times].name,name)==0)
        {
            return times;
        }
    }
    return ERROR;
}
int findbooknumber(List L,int num)//根據書的編號查詢書籍的位置
{
    int times;//記錄查詢的位置
    if(is_empty(L)){
        printf("書籍為空,無法查詢[email protected]@\n");
        return ERROR;
    }
    for(times = L.length-1; times >= 0;times--)
    {
        if(L.Book[times].number==num)
        {
            return times;
        }
    }
    return ERROR;
}

void travel(List L)//遍歷整個順序表
{
    int times = L.length;
    while(times-->0)
    {
        printf("第%d本書:\n",times+1);
        printf("數量是:%d\n",L.Book[times].count);
        printf("名稱是:%s\n",L.Book[times].name);
        printf("價格是:%d\n",L.Book[times].price);
        printf("編號是:%d\n",L.Book[times].number);
    }
    return ;
}

int count_book(List L)//計算出總數
{
    printf("一共有%d本\n",L.length);
    return OK;
}

// 以下為測試函式
int main(void)
{
    List list;            //定義一個順序表
    init(&list);
    add_book(&list);    //增加操作
    travel(list);
    modify_book(&list);    //修改操作
    travel(list);
    check_book(list);    //查詢操作
    delete_book(&list);    //刪除操作
    travel(list);        //遍歷操作
    count_book(list);    //計算總數
}

/*給我的幾點教訓就是:
    1、必須要知道全域性變數的作用域,不能隨意的定義全域性變數,很容易在函式中修改,找不到錯誤。
    2、strcpy函式以及strcmp函式要學會呼叫,以及strlen函式的使用方法。
    3、關於字串的一些操作還不是很明白,“”和‘’以及NULL的區別
*/

相關推薦

C語言一個好玩的寶石一樣的圖像

循環圖像圖形#include<stdio.h>main(){int n;scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { printf(" ")

怎麽C語言一個飛機程序

sge 怎麽 das mob gpl hdd ref dhx cte 5zeffurgal誥退俁稼犢爍厝擋傅鼓《http://weibo.com/p/230927987816857564094464》 wv8kbiqhdd壁溉斡吠戎琴痛鋼匙谷《http://weibo.c

C語言一個簡單的三子棋,實現玩家與電腦的對戰

原始碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 寫一個三子棋 */ //邏輯: //1. 畫

C語言一個簡單的掃雷小遊戲

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 語言寫一個簡單的掃雷遊戲 */ // 1.寫一個遊戲選單 M

C語言一個掃雷程式

執行環境:win10   vs2013       本程式所有設計思路均已註釋行為標記在程式中,為了方便起見,將不在部落格中進行書寫,想要學的朋友複製下面的原始碼可進行學習,也可將程式進行修改獲取不同的遊戲體驗 程式原始截圖 執行結果:

C函式指標妙c語言一個簡易類

其實在C++中的物件也並不是實現起來也並不是多麼的什麼神祕,只是編譯器幫我們做了許多工作,所以我們總覺得C++要比c語言難一些,C++編譯器其實對於類中的非Virtual 函式的的呼叫規則與對C編譯器對函式的呼叫時一樣的,那就是通過call 函式地址的方法。等有

C語言一個日期計算器

  首先,我們應知道日期計算器包括哪些功能1、明天的日期2 、n天后的日期3、兩個日期之間的天數我們先從第一個功能開始,首先建立一個日期的結構體,包括:年、月、日。struct date { int day; int month; int year; };其次來看一下解

c語言一個猜數字遊戲

#include <time.h> #include <stdlib.h> void menu() {  printf("******歡迎進入猜數字遊戲*****\n");  printf("******   1. 開始遊戲    *****\n")

C語言一個順序實現圖書館書籍管理

Function: 增add_book() 刪delete_book() 改modify_book() 查check_book() 實現吧! **************************/ #include<stdio.h>//裡

C語言一個順序

//自己寫的順序表的實現方式 /**********需求************ *************************** 模擬一種場景,圖書管理系統 *************************** Function:     增add_book()     刪delete_book()

C語言一個最短作業優先排程演算法

#include <stdio.h> //定義一個結構體 struct sjf{ char name[10]; //程序名 float arrivetime; //到達時間 float servicetime;//服務時間 float starttime; //開

(資料結構作業)C語言一個迷宮

編譯環境:win8.1+VS2015 說明:這是資料結構學完棧和佇列寫的作業。利用隨機數生成一張迷宮圖,然後用佇列找出最短路徑,用棧輸出之。可以動態顯示最短路徑喔~~~最後,這個作業用了檔案分離寫(標頭檔案宣告,.cpp檔案定義)。 Last but not

html語言一個功課表

ble mage ima http jsb type 聲明 mil .net 今天在網上看了一個關於html的教程,主要是講表格,看完之後認為有必要上機試試。於是就寫了以下的一段代碼。 <!DOCTYPE html><!--貌似5.0的能

python語言一個簡單的計算器

ali pla ket 列表 調用 語言 括號 lac 跳出循環 假如我們有這樣一個式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )思

自己C語言RL78 serial bootloader

      瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證資訊請填 bootloader),歡迎諮詢或定製bootloader(線上升級程式)。   之前用C實現過多款PIC微控制器的bootloader, 包括8-bit的PIC16,PIC18;16-bit的P

懶癌晚期學圖論的時候自己C語言了個求可達性矩陣的演算法~

可達性矩陣演算法~ 直接上程式碼 #include <iostream> #include <cstring> using namespace std; #define n 5 void print(int a[n][n]); void print1(int a[n][n]); v

c語言實現一個簡單的通訊錄

通訊錄的c語言實現原始碼 簡單通訊錄的實現還是包括三個原始檔,test.c(實現通訊錄主邏輯),txl.c(實現用到的各個函式),txl.h(存放txl中用到的各種標頭檔案與宣告)。 txl.h #ifndef __TXL_H__//**txl.h** #defi

c語言模擬實現順序的所有介面

順序表的c語言實現 此專案建立了3個原始檔,test.h用來建立結構體和函式的宣告,main.c用來實現函式,test.c用來實現順序表的總邏輯。 test.h #include<stdio.h> #include<assert.h> #include&

C語言實現靜態順序

實現順序表分為以下幾步: 1.先寫出封裝順序表結構的結構體; 2.初始化順序表; 3.增刪查改; 4.順序表的逆置等。 #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType d

C語言列印一個空心圓

演算法分析: 利用x ^ 2 + y ^ 2 = R ^ 2可以算出圓上每一點行和列的對應關係。 程式碼: #include<stdio.h> #include<math.h> int main() { int x, m; double y; for