数据结构课程设计

数据机构课程设计

来华清学习了大概有一个半月,这是学习的地三门课程《数据结构》,相比于之前所学习的课程,难度有一定的提升,刚开始学的时候还不是很懂,整个人完全是蒙圈状态,不过老师给我们细心讲解,一直鼓励我们不断地去坚持坚持再坚持,在老师和同学们的不断努力下,慢慢的学习,提升自己,终于取得了一定的成果,学习也有了一定的进步数据机构相对于小白来说,是一门比较有难度的课程,其难度不亚于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就可以实现功能的实现。

  以上是我做的数据结构课程设计,在编程语言的学习中难免会有枯燥乏味的代码,也会有熬夜也写不出来的代码,费尽脑汁也不能是实现的文件,会遇到种种困难,这都是在所难免的,但是我们一定要找到适合自己的学习方法,最最重要的是自己的坚持,如果学习感觉到累的话,可以去放松一下打把游戏,听听音乐,去楼下逛一圈,都可以。然后完了再回来继续学习,学习是一个漫长重复且艰难的过程,经历了整个过程,经历了暴风雨的洗礼,迎来的就会是属于自己的彩虹。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值