#include <stdio.h>
typedef struct node{
struct node* next;
int data;
int arry_i;
}node_t;
void insert_list_head(int data,int i,node_t **head_addr){
node_t *p=(node_t*)malloc(sizeof(node_t));
if(*head_addr==NULL)
{
p->next=NULL;
}
else
{
p->next=*head_addr;
}
p->data=data;
p->arry_i=i;
*head_addr=p;
}
void creat_hash_tab(int A[10],node_t* hash_arr[4],int hash_key){
int hash_index,i,n;
for(i=0;i<4;i++)
{
hash_arr[i]=NULL;
}
for(n=0;n<10;n++)
{
if(A[n]<hash_key)
{
insert_list_head(A[n],n,&hash_arr[0]);
}
else
{
hash_index=(A[n]%hash_key)+1;
insert_list_head(A[n],n,&hash_arr[hash_index]);
}
}
}
/******************************************
void display_hash_tab(node_t* hash_arr[])
{
int i;
for(i=0;i<4;i++)
{
node_t* p=hash_arr[i];
printf("line %d--->",i);
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("null\n");
}
}
******************************************/
node_t* search_list(node_t* hash_arry[],int hash_arry_index,int search_val,node_t* search_start){
node_t* p=search_start;
if(p!=NULL)
{
while(p!=NULL){
if(p->data==search_val)
{
return p;
}
else
{
p=p->next;
}
}
}
else{
p=hash_arry[hash_arry_index];
while(p!=NULL){
if(p->data==search_val)
{
return p;
}
else
{
p=p->next;
}
}
}
return NULL;
}
int* twoSum(node_t* nums[], int numsSize, int target){
int result[numsSize];
node_t* ret=NULL;
node_t* p;
int *p_1;
int hash_index,i,target_rest;
for(i=0;i<4;i++)
{
p=nums[i];
while(p!=NULL){
target_rest=target-p->data;
if(target_rest<3){
hash_index=0;
}
else{
hash_index=(target_rest%3)+1;
}
if(hash_index==i){
ret=search_list(nums,hash_index,target_rest,p->next);
}
else{
ret=search_list(nums,hash_index,target_rest,NULL);
}
if(ret!=NULL){
result[0]=p->arry_i;
result[1]=ret->arry_i;
p_1=result;
return p_1;
}
p=p->next;
}
}
return NULL;
}
void main(){
int A[10]={1,2,3,4,5,6,7,8,9,11};
node_t* hash_arr[4];
creat_hash_tab(A,hash_arr,3);
// display_hash_tab(hash_arr);
int*ret;
ret=twoSum(hash_arr, 2, 9);
printf("[%d,%d]\n",ret[0],ret[1]);
}
===========================================
[root@test1 ~]# gcc -g hash.c -o hash
[root@test1 ~]# ./hash
[1,6]