c語言:快遞管理系統
阿新 • • 發佈:2019-02-06
/****** LinkList.h ******/
#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define SIZE 40
//定義連結串列節點資料型別
struct LinkNode
{
struct LinkNode *next;
};
//連結串列資料型別
struct LinkList
{
struct LinkNode header;
int size;
};
//初始化
struct LinkList *Init_LinkList();
//插入
void Insert_LinkList(struct LinkList *list, int pos, void *data);
//遍歷
void Foreach_LinkList(struct LinkList *list,void(*myforeach)(void *));
//刪除
void Remove_LinkList(struct LinkList *list, int pos);
//銷燬連結串列
void Destroy_LinkList(struct LinkList *list);
/**連結串列中尋找一個特定值,返回該節點值指標 回撥函式**/
//void FindPackageLinkList(struct LinkList *list,void * data,void (*myFunc)(void *));
//獲取包裹數量
void GetMountPackage(struct LinkList *list);
//選單選項
void Menu();
void ChangeLine();
/****** LinkList.c ******/
#include"LinkList.h"
//初始化連結串列
struct LinkList *Init_LinkList()
{
struct LinkList *list = (struct LinkList*)malloc(sizeof(struct LinkList));
list->header.next = NULL;
list ->size = 0;
return list;
}
//插入資料
void Insert_LinkList(struct LinkList *list, int pos, void *data)
{
//輔助指標變數
struct LinkNode *pCurrent = &(list->header);
//插入資料
struct LinkNode *newnode = (struct LinkNode *)data;
int i;
if (NULL == list)
{
return;
}
if (NULL == data)
{
return;
}
if (pos < 0 || pos > list->size)
{
pos = list->size;
}
for (i = 0; i < pos; ++i)
{
pCurrent = pCurrent->next;
}
newnode->next = pCurrent->next;
pCurrent->next = newnode;
list->size++;
}
//遍歷連結串列
void Foreach_LinkList(struct LinkList *list, void(*myforeach)(void *))
{
//輔助指標變數
struct LinkNode *pCurernt = list->header.next;
if (NULL == list)
{
return;
}
if (NULL == myforeach)
{
return;
}
while (pCurernt != NULL)
{
myforeach(pCurernt);
pCurernt = pCurernt->next;
}
}
//刪除連結串列元素
void Remove_LinkList(struct LinkList *list, int pos)
{
struct LinkNode *pCurrent = &(list->header);
//快取下待刪除節點
struct LinkNode *pDel = pCurrent->next;
int i;
if (NULL == list)
{
return;
}
if (pos < 0 || pos > list->size - 1)
{
return;
}
for (i = 0; i < pos; ++i)
{
pCurrent = pCurrent->next;
}
//重新建立待刪除節點前驅和後繼節點關係
pCurrent->next = pDel->next;
list->size--;
}
//銷燬連結串列
void Destroy_LinkList(struct LinkList *list)
{
if (NULL == list)
{
return;
}
free(list);
list = NULL;
}
//獲取當前快遞數量
void GetMountPackage(struct LinkList *list)
{
printf("當前的快遞數量總共有: %d個\n",list->size);
}
//選單選項
void Menu()
{
puts("****歡迎使用快遞管理系統****");
puts("----------------------------");
puts("------ 0.退出使用 ---------");
puts("------ 1.開始錄入資訊-------");
puts("----------------------------");
puts("*********謝謝使用***********");;
putchar('\n');
}
void ChangeLine()
{
puts("---------------");
puts("---------------");
}
/****** test.c ******/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList.h"
//包裹的資料結構,資料首地址的位置包含連結串列節點
struct Package
{
struct LinkNode node;
char packagName[SIZE]; //櫃子
int layer; //某層
int gria; //某格
unsigned long long telephoneNumber; //電話號碼
};
//列印快遞詳細資訊
void myFunc(void *data)
{
struct Package *mPtr = (struct Package*)data;
printf("\n您的快遞位於櫃子: %s\n%d 層\n%d 格\n手機號碼是:%lld\n\n",mPtr->packagName,
mPtr->layer,mPtr->gria,mPtr->telephoneNumber);
}
/**連結串列中尋找一個特定值**/
void FindPackageLinkList(struct LinkList *list,unsigned long long daya,struct Package *p);
//錄入包裹的詳細資訊
void EnterPackageInformatin()
{ //初始化連結串列
struct LinkList *list = Init_LinkList();
int n,index,flag;
unsigned long long int findNum;
struct Package *mPtr = NULL;
printf("當前櫃子中快遞數量是0,輸入存放快遞的數量\n");
scanf("%d",&n);
flag = n;
printf("存放快遞的數量是:%d\n\n",n);
mPtr = (struct Package *)malloc(sizeof(struct Package)*n);
for (index=0;index<n;index++)
{
printf("請輸入第%d個快遞的詳細資訊(櫃子名稱、層號、格號、電話號碼)\n",index+1);
printf("還差%d個未錄入\n\n",flag-index-1);
mPtr[index].node.next = NULL;
scanf("%s%d%d%lld",mPtr[index].packagName,&(mPtr[index].layer),
&(mPtr[index].gria),&(mPtr[index].telephoneNumber));
puts("*********************");
Insert_LinkList(list,0,&mPtr[index]);
}
ChangeLine();
//遍歷列印當前連結串列中的包裹數量
Foreach_LinkList(list,myFunc);
ChangeLine();
//統計當前包裹的數量大小
GetMountPackage(list);
ChangeLine();
puts("請輸入你要查詢的快遞的手機號碼!");
scanf("%lld",&findNum);
FindPackageLinkList(list,findNum,mPtr);
}
/**連結串列中尋找一個特定快遞**/
void FindPackageLinkList(struct LinkList *list,unsigned long long int data,struct Package *p)
{
struct LinkList *mPtr = list;
struct LinkNode *mPcur = NULL;
if (NULL == list||NULL == p)
{
return ;
}
//mPtr = (struct LinkList *)list;
mPcur = mPtr->header.next;
while (mPcur != NULL)
{
if (data == p->telephoneNumber)
{
puts("您好!找到你得快遞,詳細資訊是:");
myFunc(p);
return;
}
else
{
puts("很抱歉,沒有找到你的快遞!");
return;
}
mPcur = mPcur->next;
}
if (NULL == mPcur)
{
return;
}
return ;
}
int main(){
int number;
Menu(); //顯示選單功能
Again:
scanf("%d",&number);
switch (number)
{
case 0:exit(EXIT_FAILURE);break;
case 1:EnterPackageInformatin();Menu();goto Again;
default:perror("選擇錯誤!(重新輸入)");Menu();goto Again;
}
system("pause");
return EXIT_SUCCESS;
}