数据机构课程设计
来华清学习了大概有一个半月,这是学习的地三门课程《数据结构》,相比于之前所学习的课程,难度有一定的提升,刚开始学的时候还不是很懂,整个人完全是蒙圈状态,不过老师给我们细心讲解,一直鼓励我们不断地去坚持坚持再坚持,在老师和同学们的不断努力下,慢慢的学习,提升自己,终于取得了一定的成果,学习也有了一定的进步数据机构相对于小白来说,是一门比较有难度的课程,其难度不亚于C++,但是不管学什么都需要自己的坚持,只要肯坚持肯努力,就一定会有回报的。
下面是我学习数据机构时候做的课程设计,大家可以参考借鉴,有不对的地方也希望大家能指出来,大家一起学习,一起进步。
我是基于哈希表制作的类似于美团的花店管理系统,用了三个文件hash.c main.c hash.h来制作这次文件还使用makefile的嵌套,建立src include bin obj四个文件夹,来实现三个文件的运行。下面是主要函数代码:
Hash.h:
#ifndef _HASH_H_
#define _HASH_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 1000
enum HASH_OP
{
HASH_ERR=-1,
HASH_OK,
HASH_EMPTY,
HASH_NOT_FOUND,
};
//描述鲜花属性的结构体
typedef struct data_t
{
char name[20];//鲜花名称
char color[20];//鲜花颜色
int number;//鲜花数量
char buyname[20];//购买者姓名
int iphone;//购买者电话
char choose[20];//选择外卖还是到店自取
char beizhu[50];//备注
unsigned long id;//订单号
}data_t;
//描述结点的结构体
typedef struct Node
{
data_t data;
struct Node *pNext;
}Node;
//描述哈希表的结构体
typedef struct Hash
{
struct Node *pHead;
Node *arr[SIZE];
int count;
}Hash;
//创建哈希表
Hash *create_hash();
//插入订单
int insert_item_hash(Hash *pHash,data_t tData);
//删除订单
int delete_itm_hash(Hash *pHash,unsigned long id);
//查找订单
int find_itm_hash(Hash *pHash,const char *buyname);
//销毁哈希表
void destroy_hash(Hash **ppHash);
//查看全部订单
void show_hash(Hash *pHash);
#endif
Hash.h 文件里主要是函数声明,头文件和结构体的描从而述建立大概的思路
然后是hash.c:
#include"../include/hash.h"
static Node *create_node(data_t tData)
{
Node *pNode = (Node *)malloc(sizeof(Node));
if(NULL == pNode)
{
return NULL;
}
memset(pNode,0,sizeof(Node));
pNode->data=tData;
return pNode;
}
//创建哈希表
Hash *create_hash()
{
//申请哈希表空间,没有结点
Hash *pHash = (Hash *)malloc(sizeof(Hash));
if(NULL == pHash)
{
return NULL;
}
memset(pHash,0,sizeof(Hash));
return pHash;
}
//插入订单
int insert_item_hash(Hash *pHash,data_t tData)
{
Node *pNode = NULL;
int index;
if(NULL == pHash)
{
return HASH_ERR;
}
//创建结点
pNode = create_node(tData);
//根据哈希函数计算下标
index = pNode->data.id % 997;
//找到那一个是单链表
//插入订单
//如果此时的index处为NULL
//如果index处已经有结点
//代码一样
pNode->pNext = pHash->arr[index];
pHash->arr[index]=pNode;
pHash->count++;
return HASH_OK;
}
//修改订单
int change_item_hash(Hash *pHash,int pos,data_t tData)
{
Node *pNode = NULL;
Node *pTmp = NULL;
int i;
if(NULL == pHash || pos < 0 || pos > pHash->count)
{
return HASH_ERR;
}
//创建新的结点
pNode = create_node(tData);
//找到想要插入的位置
for(i=0;i<pos;i++)
{
pTmp = pTmp->pNext;
}
//如果是空表
if(0 == pHash->count)
{
pHash->pHead = pNode;
}
else
{
pNode->pNext = pTmp->pNext;
pTmp->pNext = pNode;
}
pHash->count++;
return HASH_OK;
}
//查看订单
int delete_itm_hash(Hash *pHash,unsigned long id)
{
int index;
Node *pDel,*pTmp;
if(NULL == pHash)
{
return HASH_ERR;
}
if(0 == pHash->count)
{
return HASH_EMPTY;
}
// 根据订单号删除订单号的结点
index = id % 997;
//如果pHash->data[index]=NULL,直接返回
if(NULL == pHash->arr[index])
{
return HASH_NOT_FOUND;
}
//遍历链表 找结点 然后删除
//第一个结点的地址是pHash->data[index]
pTmp = pHash->arr[index];
pDel = pTmp->pNext;
//如果第一个结点就是要删除的结点的话
if(pTmp->data.id == id)
{
pHash->arr[index] = pTmp->pNext;
free(pTmp);
return HASH_OK;
}
//or
while(pDel != NULL)
{
if(pDel->data.id == id)
{
break;
}
pTmp = pTmp->pNext;
pDel = pTmp->pNext;
}
pTmp->pNext = pDel->pNext;
free(pDel);
return HASH_OK;
}
//查看订单
int find_itm_hash(Hash *pHash,const char *buyname)
{
int i;
Node *pTmp;
int flag=0;
if(NULL == pHash)
{
return HASH_ERR;
}
//安名字查找
//遍历哈希表
for(i=0;i<SIZE;i++)
{
if(NULL == pHash->arr[i])
{
continue;
}
pTmp = pHash->arr[i];
//遍历链表
while(pTmp !=NULL)
{
if(0 == strcmp(pTmp->data.buyname,buyname))
{
flag = 1;
printf("------------------------------\n");
printf("鲜花名称:%s\n",pTmp->data.name);
printf("鲜花颜色:%s\n",pTmp->data.color);
printf("购买的鲜花数量:%d\n",pTmp->data.number);
printf("购买人姓名:%s\n",pTmp->data.buyname);
printf("购买人电话:%d\n",pTmp->data.iphone);
printf("%s\n",pTmp->data.choose);
printf("备注:%s\n",pTmp->data.beizhu);
printf("------------------------------\n");
}
pTmp = pTmp->pNext;
}
}
if(0 == flag)
{
return HASH_NOT_FOUND;
}
return HASH_OK;
}
//销毁哈希表
void destroy_hash(Hash **ppHash)
{
int i;
Node *pDel = NULL;
if(NULL == *ppHash || NULL == ppHash)
{
return;
}
//遍历哈希表
//使用头方法删除每一个单链表
for(i=0;i<SIZE;i++)
{
if(NULL == (*ppHash)->arr[i])
{
continue;
}
pDel = (*ppHash)->arr[i];
while(pDel != NULL)
{
(*ppHash)->arr[i] = pDel->pNext;
free(pDel);
pDel = (*ppHash)->arr[i];
}
}
//销毁哈希表
free(*ppHash);
*ppHash = NULL;
}
//展示
void show_hash(Hash *pHash)
{
int i;
Node *pTmp;
if(NULL == pHash)
{
return;
}
//遍历哈希表
for(i=0;i<SIZE;i++)
{
if(NULL == pHash->arr[i])
{
continue;
}
pTmp = pHash->arr[i];
//遍历链表
while(pTmp !=NULL)
{
printf("------------------------------\n");
printf("鲜花名称:%s\n",pTmp->data.name);
printf("鲜花颜色:%s\n",pTmp->data.color);
printf("购买的鲜花数量:%d\n",pTmp->data.number);
printf("购买人姓名:%s\n",pTmp->data.buyname);
printf("购买人电话:%d\n",pTmp->data.iphone);
printf("%s\n",pTmp->data.choose);
printf("备注:%s\n",pTmp->data.beizhu);
printf("------------------------------\n");
pTmp=pTmp->pNext;
}
}
}
Hash.c里则是函数和各个功能的实现,再然后就是main函数:
#include"../include/hash.h"
int main()
{
int j,k,n;
Hash *pHash = NULL;
int cmd;//输入的选择
data_t tData;//输入的元素
data_t dData;//删除的元素
int ret;//函数返回值
unsigned long id;
char buyname[20] = {0};
int pos;
FILE *fp = NULL;
pHash = create_hash();
while(1)
{
//显示菜单
MENU:
printf("************************************\n");
printf("1 下单 2 删除订单 3 查找订单\n");
printf("4 查看订单 5 退出 \n");
printf("************************************\n");
//输入命令
printf("清选择:");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
printf("鲜花名称: ");
scanf("%s",tData.name);
printf("鲜花颜色: ");
scanf("%s",tData.color);
printf("需要购买的鲜花数量:");
scanf("%d",&tData.number);
printf("姓名:");
scanf("%s",tData.buyname);
printf("电话:");
scanf("%d",&tData.iphone);
printf("到店自取还是外卖:");
scanf("%s",tData.choose);
printf("备注:");
scanf("%s",tData.beizhu);
printf("订单号:");
scanf("%ld",&tData.id);
ret = insert_item_hash(pHash,tData);
if(HASH_ERR == ret)
{
printf("插入失败!\n");
}
break;
case 2:
printf("订单号: ");
scanf("%ld",&id);
ret = delete_itm_hash(pHash,id);
if(HASH_ERR == ret)
{
printf("删除失败\n");
}
else if(HASH_EMPTY == ret)
{
printf("空表\n");
}
else if(HASH_NOT_FOUND == ret)
{
printf("没有该订单\n");
}
else if(HASH_OK == ret)
{
printf("删除成功!\n");
}
break;
case 3:
printf("请输入管理员密码:\n");
scanf("%d",&k);
if(1 == k)
{
printf("buyname: ");
scanf("%s",buyname);
ret = find_itm_hash(pHash,buyname);
if(HASH_ERR == ret)
{
printf("查找失败!");
}
else if(HASH_NOT_FOUND == ret)
{
printf("没有此订单\n");
}
break;
}
else
{
printf("您不是管理员无法访问!\n");
}
break;
case 4:
printf("请输入管理员密码:\n");
scanf("%d",&j);
if(1==j)
{
printf("4\n");
show_hash(pHash);
goto MENU;
}
else
{
printf("您不是管理员无法访问!\n");
}
break;
case 5:
printf("欢迎下次光临\n");
goto END;
}
}
END:
//销毁
destroy_hash(&pHash);
return 0;
}
然后开始建立makefile
将.c文件移动至src文件中 .h文件放入include里
创建各自的makefile在主目录中建立总控makefile
使用makefile就可以实现功能的实现。
以上是我做的数据结构课程设计,在编程语言的学习中难免会有枯燥乏味的代码,也会有熬夜也写不出来的代码,费尽脑汁也不能是实现的文件,会遇到种种困难,这都是在所难免的,但是我们一定要找到适合自己的学习方法,最最重要的是自己的坚持,如果学习感觉到累的话,可以去放松一下打把游戏,听听音乐,去楼下逛一圈,都可以。然后完了再回来继续学习,学习是一个漫长重复且艰难的过程,经历了整个过程,经历了暴风雨的洗礼,迎来的就会是属于自己的彩虹。