回覆列表
  • 1 # 錢布斯

    #include<stdio.h>

    #include<stdlib.h>

    #include<string.h>

    #include<malloc.h>

    #define max 32

    int ifempty=0;//標誌,判斷連結串列是無否為空

    typedef struct dnode /* 定義雙向連結串列結構體 */

    {

    int number; /* 貨物編號 */

    char name[max]; /* 貨物名稱 */

    int counter; /* 貨物數量 */

    struct dnode *prior, *next;

    /* 定義兩指標,分別指向其前驅和後繼 */

    }dlnode;

    dlnode *create(dlnode *L);

    dlnode *input(dlnode *L);

    dlnode *output(dlnode *L);

    dlnode * outnum(dlnode *L);

    dlnode * outname(dlnode *L);

    dlnode *current(dlnode *L);

    void search(dlnode *L);

    void print(dlnode *L);

    void searchnum(dlnode *L);

    void searchname(dlnode *L);

    void display(dlnode *L) ;

    void main()

    {

    int x;

    dlnode *L;

    if(!(L=(dlnode *)malloc(sizeof(dlnode)))) //分配空間

    {

    printf("\n");

    exit(1);

    }

    create(L);///呼叫函式,建立頭節點

    while(1)

    {////////////////////////主選單///////////////////////////

    printf(" ============================\n");

    printf(" 1. 貨物出庫和入庫\n");

    printf(" 2. 查詢貨物表\n");

    printf(" 3. 顯示倉庫貨物表\n");

    printf(" 4. 輸出到檔案\n");

    printf(" 0. 退出\n");

    printf(" =============================\n");

    printf(" 選擇0--3:");

    scanf("%d",&x);

    switch(x)

    {

    case 2:search(L);break;//呼叫查詢函式

    case 1:current(L);break;//呼叫入庫出庫函式

    case 3:display(L);break;//呼叫顯示輸出函式

    case 4:print(L);break;//呼叫列印函式

    case 0:printf("\n bye!see you!\n");

    getchar();getchar();exit(0);//退出程式

    default:printf("\n Enter erreor!please input 0--4!");

    getchar();getchar();

    }

    }

    }

    dlnode *create(dlnode *L)//建立連結串列頭節點

    {

    getchar();

    ifempty=0;

    ///////初始化頭節點的值////////

    L->next=NULL;L->prior=NULL;

    L->number=L->counter=0;

    strcpy(L->name," ");

    return L;

    }

    void search(dlnode *L) ///查詢的主要選單

    {

    int y;

    if(ifempty==0)

    {

    printf("沒有輸入貨物!\n");

    getchar();getchar();

    return;

    }

    else

    {

    while(1)

    {

    printf("=====================\n");

    printf("1.按編號查詢\n");

    printf("2.按貨物名稱查詢\n");

    printf("0.返回上一層\n");

    printf("====================\n");

    printf("選擇0--2:");

    scanf("%d",&y);

    switch(y)

    {

    case 1:searchnum(L);break;//呼叫按編號查詢的函式

    case 2:searchname(L);break;//呼叫按名稱查詢的函式

    case 0:return;//返回

    default:printf("enter error!Please input 0--2!\n\n");

    getchar();getchar();printf("\n\n");

    }

    }

    }

    }

    void searchnum(dlnode *L)///按編號查詢的函式

    {

    int num,flag=0;//flag為是否找到的標誌

    dlnode *head=L;

    if(ifempty==0)

    {

    printf("沒有貨物被輸入\n");

    getchar();getchar();

    return;

    }

    printf("輸入你要查詢的貨物編號:\n");

    scanf("%d",&num);

    while((L=L->next)!=head)

    {

    if(L->number==num)

    { flag=1;//flag為1時表示找到

    printf("找到指定編號貨物 \n");

    printf("\n編號:%d\n",L->number);

    printf("名稱:%s\n",L->name) ;

    printf("數量:%d\n\n",L->counter);

    }

    }

    if(flag==0)//flag為0時表示沒有找到

    printf("沒有找到指定編號貨物,請檢視是否還有貨物。\n");

    getchar();getchar();

    }

    void searchname(dlnode *L)//按名稱查詢的函式

    {

    int flag=0;//flag為是否找到的標誌

    char na[32];

    dlnode *head=L;

    if(ifempty==0)

    {

    printf("沒有貨物被輸入\n");

    getchar();getchar();

    return;

    }

    printf("輸入你要查詢的貨物名稱\n");

    scanf("%s",&na);

    while((L=L->next)!=head)

    {

    if(strcmp(L->name,na)==0)

    { flag=1;//flag為1時表示找到

    printf("找到指定名稱貨物 \n");

    printf("\n編號:%d\n",L->number);

    printf("名稱:%s\n",L->name) ;

    printf("數量:%d\n\n",L->counter);

    }

    }

    if(flag==0)//flag為0時表示沒有找到

    printf("沒有找到指定編號貨物,請檢視是否還有貨物。\n\n");

    getchar();getchar();

    }

    dlnode *current(dlnode *L)//貨物出庫入庫函式

    {

    int y;

    while(1)

    {

    printf("========================\n");

    printf(" 1.貨物入庫\n");

    printf(" 2.貨物出庫\n");

    printf(" 0.返回上一層\n");

    printf("========================\n");

    printf(" 選擇0--2:");

    scanf("%d",&y);

    switch(y)

    {

    case 1:input(L);break;//呼叫入庫函式

    case 2:output(L);break;//調用出庫函式

    case 0:return(L);//返回上一層

    default:printf("enter error!Please input 0--2!");

    getchar();getchar();

    printf("\n\n");

    }

    }

    }

    dlnode *input(dlnode *L)//定義入庫函式

    {

    dlnode *in,*head;

    head=in=(dlnode *)malloc(sizeof(dlnode));//分配空間

    head=L;

    printf("\n請輸入貨物資料:\n");

    printf("編號:");scanf("%d",&in->number);

    printf("名稱:");scanf("%s",&in->name);

    printf("數量:");scanf("%d",&in->counter);

    if(L->next==NULL) //如果只有頭節點,

    { //把剛輸入的in節點

    L->next=in; //跟在頭節點後面

    L->prior=in; //

    in->next=L; //

    in->prior=L; //

    ifempty++; //ifempty加1

    }

    else

    {//如果當前L的下一個節點不是頭節點

    while((L=L->next)!=head)

    {//如果輸入的數大於L->number,則插到L的前面

    if(L->number<in->number)

    {

    in->next=L;

    in->prior=L->prior;

    L->prior->next=in;

    L->prior=in;

    ifempty++; //ifempty加1

    return(head);

    }

    }

    //輸入的編號比其它編號都小,則插到最後個節點,並首尾相連

    head->prior->next=in;

    in->prior=head->prior;

    head->prior=in;

    in->next=head;

    ifempty++; //ifempty加1

    }

    return head;

    }

    dlnode *output(dlnode *L)//出庫的函式

    {

    int y;

    dlnode *head=L;

    if(ifempty==0)//檢測是否有貨物輸入

    {

    printf("沒有貨物輸入系統\n");

    getchar();getchar();

    return(head);

    }

    while(1)

    {

    printf("=============\n");

    printf("1.按編號出庫\n");

    printf("2.按名稱出庫\n");

    printf("0.返回上一層\n");

    printf("==============\n");

    printf("選擇0--2:");scanf("%d",&y);

    switch(y)

    {

    case 1:outnum(L);break;//呼叫按編號出庫函式

    case 2:outname(L);break;//呼叫按名稱出庫函式

    case 0:return(L);

    default:printf("enter error!Please input 0--2!");

    getchar();getchar();printf("\n\n");

    }

    }

    }

    dlnode *outnum(dlnode *L)//按編號出庫函式

    {

    int num;

    dlnode *head=L;

    printf("請輸入出庫貨物的編號:");

    scanf("%d",&num);

    while((L=L->next)!=head)

    if(L->number==num)

    {

    L->prior->next=L->next;

    L->next->prior=L->prior;

    ifempty--; //ifempty減1

    printf("編號為%d的貨物成功出庫",num);

    getchar();getchar();

    return head;

    }

    }

    printf("沒有此編號的貨物,請檢視是否還有貨物。\n\n");

    getchar();getchar();

    return (head);

    }

    dlnode *outname(dlnode *L)//按名稱出庫函式

    {

    char na[32];

    dlnode *head=L;

    printf("請輸入出庫貨物的名稱:");

    scanf("%s",&na);

    while((L=L->next)!=head)

    if(strcmp(L->name,na)==0)

    {

    L->prior->next=L->next;

    L->next->prior=L->prior;

    ifempty--; //ifempty減1

    printf("名稱為%s的貨物成功出庫",na);

    getchar();getchar();

    return (head);

    }

    }

    printf("沒有此名稱的貨物,請檢視是否還有貨物。\n\n");

    getchar();getchar();

    return(head);

    }

    void display(dlnode *L)//顯示貨物清單

    {

    dlnode *head=L;

    if(ifempty==0)

    {

    printf("沒有貨物可顯示\n");

    getchar();getchar();

    return;

    }

    L=L->next;

    do

    {

    printf("\n編號:%d\n",L->number);

    printf("名稱:%s\n",L->name) ;

    printf("數量:%d\n\n",L->counter);

    }while((L=L->next)!=head);

    getchar();getchar();

    }

    void print(dlnode *L)

    {

    dlnode *head=L;

    L=L->next;

    char filename[max];

    FILE *out;

    if(ifempty==0)

    {

    printf("沒有貨物可輸出\n");

    getchar();getchar();

    return;

    }

    printf("請輸入檔名稱:");

    scanf("%s",filename);

    if((out=fopen(filename,"w"))==NULL)

    {

    printf("開啟檔案失敗!\n");

    getchar();getchar();

    return;

    }

    do{

    fprintf(out,"編號:%d\n名稱:%s\n數量:%d\n\n",L->number,L->name,L->counter);

    }while((L=L->next)!=head);

    printf("輸出成功\n");getchar();getchar();

    fclose(out);

    }

  • 中秋節和大豐收的關聯?
  • 打一個三國名人成語?