仓库管理系统 C语言 C++ 数据结构 链表 课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
}


相关文档
最新文档