2020-07-17(C语言)数据结构按值查找表结点值地址

Python016

2020-07-17(C语言)数据结构按值查找表结点值地址,第1张

//按值查找表结点值地址

typedef struct LNode

{

int data

struct LNode *next

} LNode, *LinkList

LinkList List_TailInsert(LinkList L)

{

int x//设元素类型为整型

L = (LinkList)malloc(sizeof(LNode))

LNode *s, *r = L//r为表尾指针

printf("请输入表元素(以999结尾):")

scanf("%d", &x)//输入结点的值

while (x != 999) //输入999表示结束

{

s = (LNode *)malloc(sizeof(LNode))

s->data = x

r->next = s

r = s//r指向新的表尾结点

scanf("%d", &x)

}

r->next = NULL//尾结点指针置空

return L

}

void print(LinkList L)

{

while (L->next != NULL)

{

L = L->next

printf("%d ", L->data)

}

}

LNode *LocateElem(LinkList L, int e)

{

int i = 1

LNode *p = L->next //头结点赋给p

while (p != NULL &&p->data != e) //从第1个结点开始找data值为e的结点

{

p = p->next

i++

}

return p//找到后返回该结点指针,否则返回NULL

}

int main()

{

LinkList L, A

LNode *p

int e, i

A = (LinkList)malloc(sizeof(LNode))

A = List_TailInsert(L)

printf("尾插法建立的单链表:")

print(A)

printf("\n")

printf("请输入要查找的值:")

scanf("%d", &e)

p = LocateElem(A, e)

printf("要查找的值%d的地址为%p.", e, p)

printf("\n")

return 0

}

#include<stdio.h>

#include<stdlib.h>

#define N 10

void shellpass(int a[], int n, int d)

{

int i,j,temp

for(i=di<ni++)

{

if(a[i]<a[i-d])

{

temp=a[i]

for(j=i-dj>=0&&temp<a[j]j-=d)

a[j+d]=a[j]

a[j+d]=temp

}

}

}

void shellsort(int a[], int n, int delta[], int t)

{

int i, j

for(i=0 i<t i++)

{

shellpass(a, n, delta[i])

printf("第%d趟希尔排序,增量为%d,排序之后的结果\n",i+1,delta[i])

for(j=0 j<n j++)

{

printf("%d\t",a[j])

}

printf("\n")

}

}

void main()

{

int n=N, a[N]

int b[3] = {5,3,1}

int i

printf("输入%d个数\n", n)

for(i=0i<ni++)

{

printf("第%d个数:\t",i+1)

scanf("%d",&a[i])

}

shellsort(a, n, b, 3)

printf("最终希尔排序之后的结果\n")

for(i=0i<ni++)

{

printf("%d\t",a[i])

}

printf("\n")

}

关键字序列是{22,41,53,8,46,30,1,31,66}, 计算过程如下:

插入关键字22, 索引(散列值) = 3*22 mod 11 = 0, 存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22

插入关键字41, 索引(散列值) = 3*41 mod 11 = 2, 存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41

插入关键字53, 索引(散列值) = 3*53 mod 11 = 5, 存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41          53

插入关键字8, 索引(散列值) = 3*8 mod 11 = 2, 有冲突,取索引2+1=3,没有冲突,存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41   8      53

插入关键字46, 索引(散列值) = 3*46 mod 11 = 6, 存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41   8      53  46

插入关键字30, 索引(散列值) = 3*30 mod 11 = 2, 有冲突,取索引2+1=3,仍有冲突,

取索引3+1=4,没有冲突,存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41   8  30  53  46

插入关键字1, 索引(散列值) = 3*1 mod 11 = 3, 有冲突,依次取索引4,5,6,均有冲突,

取索引7,没有冲突,存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41   8  30  53  46   1

插入关键字31, 索引(散列值) = 3*31 mod 11 = 5, 有冲突,依次取索引6,7,均有冲突,

取索引8,没有冲突,存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22      41   8  30  53  46   1  31

插入关键字66, 索引(散列值) = 3*66 mod 11 = 0, 有冲突,取索引0+1=1,没有冲突,存入散列表:

  下标    0   1   2   3   4   5   6   7   8   9   10

  关键字 22  66  41   8  30  53  46   1  31

这就是最后得到的散列表.

//C语言测试程序

#include<stdio.h>

#include<stdlib.h>

#define SUCCESS 1

#define UNSUCCESS 0

#define HASHSIZE 11

#define NULLKEY -1

typedef int Status

typedef struct

{

    int *elem

    int count

}HashTable

int m=0

Status InitHashTable(HashTable *H)

{

    int i

    m=HASHSIZE

    H->count=m

    H->elem=(int *)malloc(m*sizeof(int))

    for(i=0i<mi++)

    {

        H->elem[i]=NULLKEY

    }

    return SUCCESS

}

int Hash(int key)

{

    return (3*key) % m

}

void InsertHash(HashTable *H,int key)

{

    int addr

    int pos

    pos=Hash(key)

    addr=pos

    while(H->elem[addr] != NULLKEY)

    {

        ////////

        printf("索引=%d 有冲突.\n",addr)

        ////////

        addr = (addr+1) % m

        if(addr==pos)

        {

            printf("\n散列表已满!\n")

            exit(1)

        }

    }

    H->elem[addr]=key

}

Status SearchHash(HashTable H,int key,int *addr)

{

    *addr = Hash(key)

    while(H.elem[*addr] != key)

    {

        *addr = (*addr+1) % m

        if(H.elem[*addr]==NULLKEY || *addr==Hash(key))

        {

            return UNSUCCESS

        }

    }

    return SUCCESS

}

void showHashTable(HashTable *H)

{

    int i

    for(i=0  i < H->count i++)

    {

        printf("%4d",i)

    }

    printf("\n")

    for(i=0  i < H->count i++)

    {

        if(H->elem[i]==NULLKEY)

        {

            printf("%4c",0x20)

        }

        else

        {

            printf("%4d",H->elem[i])

        }

    }

    printf("\n")

}

int main()

{

    int key[]={22,41,53,8,46,30,1,31,66}

    int len

    int i

    HashTable H

    InitHashTable(&H)

    len=sizeof(key)/sizeof(key[0])

    for(i=0i<leni++)

    {

        printf("插入关键字 %d, 索引(Hash) = %d\n",key[i],Hash(key[i]))

        InsertHash(&H,key[i])

        showHashTable(&H)

    }

return 0

}