1,使用哈希存储将数据存入哈希表中,并进行查找
头文件
#ifndef __HASH_H__
#define __HASH_H__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 10
#define P 13
typedef int datatype;
//定义节点结构体
typedef struct node{
datatype data;
struct node *next;
}Node;
//定义Hash顺序表———结构体指针数组
typedef struct{
Node *arr[P];
}Hash;
//创建Hash表,并初始化
Hash* create();
//申请节点
Node* apply(datatype e);
//插入数据
int insert(Hash *H,datatype e);
//遍历数据
void show(Hash *H);
//查找数据
void search(Hash *H,datatype e);
//释放Hash表
void free_hash(Hash *H);
#endif
功能函数
#include "hash.h"
//创建Hash表,并初始化
Hash* create()
{
Hash *H=(Hash*)malloc(sizeof(Hash));
if(NULL==H)
{
puts("创建失败");
return NULL;
}
memset(H->arr,0,P);
return H;
}
//申请节点
Node* apply(datatype e)
{
Node *p=(Node*)malloc(sizeof(Node));
if(NULL==p)
{
return NULL;
}
p->data=e;
p->next=NULL;
return p;
}
//插入数据
int insert(Hash *H,datatype e)
{
//判断逻辑
if(NULL==H)
{
puts("传入的Hash表无效");
return -1;
}
//申请节点
Node *p=apply(e);
if(NULL==p)
{
puts("申请失败");
return -1;
}
//计算下标
int index=e%P;
//将新节点头插入链表中
p->next=H->arr[index];
H->arr[index]=p;
return 0;
}
//遍历数据
void show(Hash *H)
{
//判断逻辑
if(NULL==H)
{
puts("传入的Hash非法");
return;
}
puts("各下标对应链表值为:");
for(int i=0;i<P;i++)
{
Node*p=H->arr[i];
printf("%d\t",i);
while(p)
{
printf("%d->",p->data);
p=p->next;
}
printf("nul\n");
}
}
//查找数据
void search(Hash *H,datatype e)
{
if(NULL==H)
{
puts("传入的Hash表无效");
return;
}
int index=e%P;
Node *p=H->arr[index];
while(p)
{
if(e==p->data)
{
break;
}
p=p->next;
}
if(p==NULL)
{
puts("没有找到");
}else
{
puts("找到了");
}
}
//释放Hash表
void free_hash(Hash *H)
{
//判断逻辑
if(NULL==H)
{
puts("传入的Hash表无效");
return;
}
//先依次释放链表
for(int i=0;i<P;i++)
{
while(H->arr[i])
{
Node *q=H->arr[i];
H->arr[i]=q->next;
free(q);
q=NULL;
}
}
free(H);
H=NULL;
}
主函数
#include "hash.h"
int main(int argc, const char *argv[])
{
//创建Hash表
Hash *H=create();
int arr[10]={25,51,8,22,26,67,11,16,54,41};
//插入数据
for(int i=0;i<N;i++)
{
insert(H,arr[i]);
}
//遍历数据
show(H);
//查找数据
search(H,24);
search(H,51);
//释放Hash表
free_hash(H);
show(H);
H=NULL;
return 0;
}
2,使用冒泡排序、选择排序、插入排序、快速排序完成下面案例
1:冒泡排序
//冒泡排序
void maopao(int *s)
{
int i,j,temp;
for(i=1;i<N;i++)
{
int flag=0;
for(j=0;j<N-i;j++)
{
if(s[j]>s[j+1])
{
temp=s[j];s[j]=s[j+1];s[j+1]=temp;
flag=1;
}
}
if(flag==0)
{
break;
}
}
}
2,选择排序
//选择排序
void select(int *s)
{
int i,j;
int temp,index;
for(i=0;i<N;i++)
{
index=i;
for(j=i+1;j<N;j++)
{
if(s[j]>s[index])
{
index=j;
}
}
if(index!=i)
{
temp=s[i];s[i]=s[index];s[index]=temp;
}
}
}
3,插入排序
//插入排序
void insert_sort(int *s)
{
int i,j;
int temp;
for(i=1;i<N;i++)
{
temp=s[i];
for(j=i;j>0&&temp<s[j-1];j--)
{
s[j]=s[j-1];
}
s[j]=temp;
}
}
4,快速排序
//快排
void part(int *arr,int low,int high)
{
if(low<high)
{
int i=low,j=high;
int temp=arr[low];
while(low<high)
{
while(low<high && arr[high]>=temp)
{
high--;
}
arr[low]=arr[high];
while(low<high && temp>=arr[low])
{
low++;
}
arr[high]=arr[low];
}
arr[low]=temp;
part(arr,i,low-1);
part(arr,low+1,j);
}else
{
return;
}
}
主函数
//主函数
int main(int argc, const char *argv[])
{
int arr[N]={198,289,98,357,85,170,232,110};
//maopao(arr);
//select(arr);
//insert_sort(arr);
//part(arr,0,N-1);
for(int i=0;i<N;i++)
{
printf("%d\t",arr[i]);
}
puts("");
return 0;
}