仓库管理系统 C语言 C++ 数据结构 链表 课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#define MAX 64
typedef struct node{ /* 定义结构体类型dnode */
int number; /* 货物编号 */
char name[MAX]; /* 货物名称 */
int counter; /* 货物数量 */
struct node *prior,*next; /* 前驱和后继指针 */
}dnode;
dnode* head = NULL;
void output_one(dnode* n) /* 输出一条记录 */
{
printf("%d\t%s\t%d\n", n->number, n->name, n->counter);
}
void output() /* 输出所有记录 */
{
dnode* pos = head;
if(head == NULL)
{
return;
}
while (pos)
{
output_one(pos); /* 循环调用output_one */
pos = pos->next;
}
}
int insert() /* 插入一条数据 */
{
dnode* pos = head;
dnode* n = malloc(sizeof(dnode));
n->prior = NULL;
n->next = NULL;
printf("请输入货物编号:");
scanf("%d", &n->number);
printf("请输入货物名称:");
scanf("%s", n->name);
printf("请输入货物数量:");
scanf("%d", &n->counter);
if(head==NULL) /* 如果还没有头节点,就作为头节点 */
{
head = n;
return 1;
}
while (pos)
{
if(pos->number > n->number) /* 按顺序查找,如果找到比自己大的,就插在它前面 */
{
if(pos->prior)
pos->prior->next = n;
n->prior = pos->prior;
pos->prior = n;
if(pos->next)
pos->next->prior = n;
n->next = pos;
return 1;
}
else if(pos->number == n->number)
{
free(n);
return 0; /* 有重复数据,插入不成功 */
}
if (!pos->next) /* 如果已经到链表尾部,插入到后面 */
{
pos->next = n;
n->prior = pos;
return 1;
}
pos = pos->next;
}
return 1;
}
void init()
{
while (1) /* 初始化,循环插入 */
{
insert();
printf("按任意键继续输入,按Esc停止输入\n");
if(getch()==27)
break;
}
}
int delete() /* 删除一条记录 */
{
int num;
dnode* pos = head;
printf("请输入要删除的编号:");
scanf("%d", &num);
if(head == NULL)
{
return 0;
}
while (pos)
{
if(pos->number == num) /* 找到匹配的项 */
{
if(pos->prior)
pos->prior->next = pos->next;
if(pos->next)
pos->next->prior = pos->prior;
free(pos);
return 1;
}
pos = pos->next;
}
return 0; // 没找到
}
int amend() /* 修改数量 */
{
int num, count;
dnode* pos = head;
printf("请输入要修改的编号:");
scanf("%d", &num);
printf("请输入要修改的数量:");
scanf("%d", &count);
if(head == NULL)
{
return 0;
}
while (pos)
{
if(pos->number == num)
{
if (count == 0) /* 如果数量是0,就删除 */
{
if(pos->prior)
pos->prior->next = pos->next;
if(pos->next)
pos->next->prior = pos->prior;
free(pos);
return 1;
}
pos->counter = count;
return 1;
}
pos = pos->next;
}
retu
rn 0;
}
void search() /* 按编号查找 */
{
int num;
dnode* pos = head;
printf("请输入要查找的编号:");
scanf("%d", &num);
if(head == NULL)
{
return;
}
while (pos)
{
if(pos->number == num)
{
output_one(pos); /* 找到就打印 */
return;
}
pos = pos->next;
}
}
void search_by_name() /* 按名称查找 */
{
char name[MAX];
dnode* pos = head;
printf("请输入要查找的名称:");
scanf("%s", name);
if(head == NULL)
{
return;
}
while (pos)
{
if(!strcmp(pos->name, name))
output_one(pos);
pos = pos->next;
}
}
int main()
{
init();
while (1)
{
char ch;
system("cls");
printf("\t\t\t\ti 增加新货物\n");
printf("\t\t\t\td 删除某种货物\n");
printf("\t\t\t\ta 修改某种货物的数量\n");
printf("\t\t\t\ts 查找指定的货物\n");
printf("\t\t\t\to 输出存货信息\n");
printf("\t\t\t\tq 退出程序\n");
ch = getch();
switch (ch)
{
case 'i':
case 'I':
insert();
break;
case 'd':
case 'D':
delete();
break;
case 'a':
case 'A':
amend();
break;
case 's':
case 'S':
printf("1. 按编号查找\n2. 按名称查找\n");
ch = getch();
if(ch == '1')
{
search();
}
else if(ch == '2')
{
search_by_name();
}
break;
case 'o':
case 'O':
output();
break;
case 'q':
case 'Q':
return 0;
break;
}
printf("按任意键继续...\n");
getch();
}
return 0;
}