c语言:快递管理系统

     该demo具有以下几个功能:

(1) 录入快递包裹信息;
(2) 查找指定快递包裹信息;
(3) 打印所有快递包裹信息;
(4) 获取所有快递包裹数量信息;
(5) 删除快递包裹信息;

/****** LinkList.h ******/

#pragma once
#include
#include
#include
#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
#include
#include
#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;
}

你可能感兴趣的:(数据结构,C语言)