1. 程式人生 > >c語言:快遞管理系統

c語言:快遞管理系統

/****** 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; }