1、哈希表的建立与使用
hash.h
#ifndef __HASH_H__
#define __HASH_H__
#include <stdio.h>
#include <stdlib.h>
#define N 13
#define MAX 10
#define SIZE 8
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
}HASH;
//创建
HASH **hash_create();
//插入数据
int insert_hash_table(HASH **h,datatype value);
//打印哈希表
int show_hash_table(HASH **h);
//查找
int search_hash_table(HASH **h,datatype value);
#endif
hash.c
#include "hash.h"
HASH **hash_create()
{
//创建指针数组
HASH **h=(HASH **)malloc(SIZE*N);
if(NULL==h)
return NULL;
//将所有指针初始化
for(int i=0;i<N;i++){
h[i]=NULL;
}
return h;
}
int insert_hash_table(HASH **h,datatype value)
{
//根据哈希函数找到存储地址
int index=value%N;
struct node *p=h[index];
//将链表的头指针,存储到该地址
struct node *temp=(struct node *)malloc(sizeof(struct node));
temp->data=value;
temp->next=NULL;
if(p==NULL){
p=temp;
}else{
temp->next=p;
p=temp;
}
h[index]=p;
return 0;
}
int show_hash_table(HASH **h)
{
struct node *p=NULL;
for(int i=0;i<N;i++){
p=h[i];
printf("%d : ",i);
if(p==NULL){
puts("NULL");
}else{
while(p!=NULL){
printf(" %d ",p->data);
printf(" -> ");
p=p->next;
}
puts("NULL");
}
}
return 0;
}
int search_hash_table(HASH **h,datatype value)
{
int index=value%N;
struct node *p=h[index];
while(p!=NULL && p->data!=value){
p=p->next;
}
if(p==NULL){
return -1;
}else{
return 0;
}
}
main.c
#include <stdio.h>
#include "hash.h"
int main(int argc, const char *argv[])
{
int arr[MAX]={25,51,8,22,26,67,11,16,54,41};
HASH **h=hash_create();
int num;
if(NULL==h){
puts("创建失败");
return -1;
}
puts("创建成功");
for(int i=0;i<MAX;i++){
insert_hash_table(h,arr[i]);
}
puts("--------------------------------");
show_hash_table(h);
puts("--------------------------------");
printf("请输入你要查找的数>>>");
scanf("%d",&num);
while(getchar()!='\n');
if(!search_hash_table(h,num)){
puts("找到了");
}else{
puts("抱歉,没有找到");
}
return 0;
}
运行结果:
2、练习冒泡排序、选择排序、插入排序、快速排序
main.c
#include <stdio.h>
//遍历函数
void show(int *arr,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
putchar(10);
}
//冒泡排序,时间复杂度O(n^2)
void pop_sort(int *arr,int n)
{
int temp;
int flag=0;
for(int i=1;i<n;i++)
{
flag=0;
for(int j=0;j<n-i;j++){
if(arr[j]>arr[j+1]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
flag=1;
}
}
if(!flag)
break;
}
}
//选择排序,时间复杂度O(n^2)
void choice_sort(int *arr,int n)
{
int index,temp;
for(int i=0;i<n;i++){
index=i;
for(int j=i+1;j<n;j++){
if(arr[index]>arr[j])
index=j;
}
if(index!=i){
temp=arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
}
}
//插入排序,时间复杂度O(n^2)
void insert_sort(int *arr,int n)
{
int temp;
int i,j;
for(i=1;i<n;i++){
temp=arr[i];
for(j=i;j>0&&temp<arr[j-1];j--){
arr[j]=arr[j-1];
}
arr[j]=temp;
}
}
//快速排序,时间复杂度O(nlbn)
void quick_sort(int *arr,int n)
{
int low=0,high=n-1;
int x=arr[0];
while(low<high){
while(x<=arr[high] && low<high){
high--;
}
arr[low]=arr[high];
while(x>=arr[low] && low<high){
low++;
}
arr[high]=arr[low];
}
arr[low]=x;
if(--low>0){
quick_sort(arr,low+1);
}
if(++high<n-1){
quick_sort(&arr[high],n-high);
}
}
int main(int argc, const char *argv[])
{
int arr[]={198,289,98,357,85,170,232,110};
int brr[]={198,289,98,357,85,170,232,110};
int crr[]={198,289,98,357,85,170,232,110};
int drr[]={198,289,98,357,85,170,232,110};
int len=sizeof(arr)/sizeof(int);
printf("冒泡排序前:\n");
show(arr,len);
pop_sort(arr,len);
printf("冒泡排序后:\n");
show(arr,len);
putchar(10);
printf("选择排序前:\n");
show(brr,len);
choice_sort(brr,len);
printf("选择排序后:\n");
show(brr,len);
putchar(10);
printf("插入排序前:\n");
show(crr,len);
insert_sort(crr,len);
printf("插入排序后:\n");
show(crr,len);
putchar(10);
printf("快速排序前:\n");
show(drr,len);
quick_sort(drr,len);
printf("快速排序后:\n");
show(drr,len);
return 0;
}
运行结果: