#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");
return;
else
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;
printf("沒有貨物被輸入\n");
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");
void searchname(dlnode *L)//按名稱查詢的函式
int flag=0;//flag為是否找到的標誌
char na[32];
printf("輸入你要查詢的貨物名稱\n");
scanf("%s",&na);
if(strcmp(L->name,na)==0)
printf("找到指定名稱貨物 \n");
printf("沒有找到指定編號貨物,請檢視是否還有貨物。\n\n");
dlnode *current(dlnode *L)//貨物出庫入庫函式
printf("========================\n");
printf(" 1.貨物入庫\n");
printf(" 2.貨物出庫\n");
printf(" 0.返回上一層\n");
printf(" 選擇0--2:");
case 1:input(L);break;//呼叫入庫函式
case 2:output(L);break;//調用出庫函式
case 0:return(L);//返回上一層
default:printf("enter error!Please input 0--2!");
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
{//如果當前L的下一個節點不是頭節點
{//如果輸入的數大於L->number,則插到L的前面
if(L->number<in->number)
in->next=L;
in->prior=L->prior;
L->prior->next=in;
L->prior=in;
return(head);
//輸入的編號比其它編號都小,則插到最後個節點,並首尾相連
head->prior->next=in;
in->prior=head->prior;
head->prior=in;
in->next=head;
return head;
dlnode *output(dlnode *L)//出庫的函式
if(ifempty==0)//檢測是否有貨物輸入
printf("沒有貨物輸入系統\n");
printf("=============\n");
printf("1.按編號出庫\n");
printf("2.按名稱出庫\n");
printf("==============\n");
printf("選擇0--2:");scanf("%d",&y);
case 1:outnum(L);break;//呼叫按編號出庫函式
case 2:outname(L);break;//呼叫按名稱出庫函式
case 0:return(L);
dlnode *outnum(dlnode *L)//按編號出庫函式
int num;
printf("請輸入出庫貨物的編號:");
L->prior->next=L->next;
L->next->prior=L->prior;
ifempty--; //ifempty減1
printf("編號為%d的貨物成功出庫",num);
printf("沒有此編號的貨物,請檢視是否還有貨物。\n\n");
return (head);
dlnode *outname(dlnode *L)//按名稱出庫函式
printf("請輸入出庫貨物的名稱:");
printf("名稱為%s的貨物成功出庫",na);
printf("沒有此名稱的貨物,請檢視是否還有貨物。\n\n");
void display(dlnode *L)//顯示貨物清單
printf("沒有貨物可顯示\n");
L=L->next;
do
}while((L=L->next)!=head);
void print(dlnode *L)
char filename[max];
FILE *out;
printf("沒有貨物可輸出\n");
printf("請輸入檔名稱:");
scanf("%s",filename);
if((out=fopen(filename,"w"))==NULL)
printf("開啟檔案失敗!\n");
do{
fprintf(out,"編號:%d\n名稱:%s\n數量:%d\n\n",L->number,L->name,L->counter);
printf("輸出成功\n");getchar();getchar();
fclose(out);
#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);
}