006年12月中兴笔试——数据结构

本文详细介绍了数据结构的几种常用查找方法(监视哨查找、折半查找)和排序方法(冒泡排序、直接插入排序),并通过代码实现展示了如何在实际应用中使用这些算法。此外,文章还探讨了线性链表的存储实现及其基本操作(初始化、插入、删除、获取指定序号元素)。最后,通过实例说明了链表的归并操作。本文旨在提供对数据结构与算法基础概念的理解和实践经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2006年12月中兴笔试——数据结构

 

 

排序及查找方法

 

#include <malloc.h>

#include<stdio.h>

#define N 11

/*用监视哨查找*/

int search(int array[],int n,int k)

{int i;

 i=n-1;

array[0]=k;

while(array[i]!=k) i--;

return(i);

}

/*折半查找法*/

int halfsearch(int array[],int n,int k)

{int i,j,mid;

 i=1;j=n;

while(i<=j)

{mid=(i+j)/2;

 if(k==array[mid]) return(mid);

else if(k<array[mid]) j=mid-1;

     else i=mid+1;

}

return(0);

}

 

/*冒泡排序法*/

void mpsort(int array[])

{int i,j,a;

a=0;

 for(i=1;i<N;i++)

 for(j=i+1;j<N;j++)

  if(array[i]>array[j])

     {a=array[i];

    array[i]=array[j];

    array[j]=a;}

}

/*直接插入排序*/

void insertsort(int array[])

{int i,j;

 for(i=2;i<N;i++)

 {array[0]=array[i];

j=i-1;

while(array[0]<array[j])

 {array[j+1]=array[j--];

 array[j+1]=array[0];

}

}

}

/*建立*/

void creat(int array[])

{int i;

 printf("enter the array:\n");

 for(i=1;i<N;i++)

 scanf("%d",&array[i]);

}

 

/*显示*/

void print(int array[])

 {int i;

  printf("The numbers after sort is:\n");

  for(i=1;i<N;i++)

  printf("%d ",array[i]);

  printf("\n");

  }

 

 

main()

{int a[11],i,x,chang;

 /*printf("enter the array\n");

 for(i=1;i<11;i++)

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

 

aga:

 printf("\nchang:1: use watching methodfinding\n      2:use half methodfinding\n      3: use directness intsertmethod sort\n      4:use bubble up methodsort\n      5:exit\n");

 scanf("%d",&chang);

 switch (chang)

 {case 1:

      {creat(a);

 printf("Please int the searchnumber:\n");

 scanf("%d",&x);

 printf("The number stationis:%d\n",search(a,N,x));

 gotoaga;

 }

 case 2:

    { creat(a);

      insertsort(a);

      print(a);

      printf("Please int the search number:\n");

      scanf("%d",&x);

      printf("The number station is:%d\n",halfsearch(a,N,x));

      goto aga;

     }

  case 3:

    {creat(a);

     insertsort(a);

     print(a);

      goto aga;

    }

 

  case 4:

    {creat(a);

     mpsort(a);

     print(a);

     goto aga;

    }

 

  case 5:{ printf("exit!\n");break;}

  default:{printf("Error!\n"); goto aga;}

}

}

 

 

 

 

 

二、线性链表的存储实现

 

struct LNODE{

 

ElemType data;

 

struct LNODE *next;

 

};

 

typedef struct LNODE LNode;

 

typedef struct LNODE * LinkList;

 

1初始化操作

 

Status Init_L(LinkList L){

 

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

 

{L->next=NULL;return 1;}

 

else return 0;

 

}

 

2插入操作

 

Status ListInsert_L(LinkList &L,inti,ElemType e){

 

p=L,j=0;

 

while(p&&j<i-1){p=p->next;++j;}

 

if(!p||j>i-1) return ERROR;

 

s=(LinkList)malloc(sizeof(LNode));

 

s->data=e;s->next=p->next;

 

p->next=s;

 

return OK;

 

}//ListInsert_L

 

 

 

3删除操作

 

Status ListDelete_L(LinkList &L,inti,ElemType &e){

 

p=L,j=0;

 

while(p&&j<i-1){p=p->next;++j;}

 

if(!p->next||j>i-1) return ERROR;

 

q=p->next;p->next=q->next;

 

e=q->data;free(q);

 

return OK;

 

}//ListDelete_L

 

 

 

 

4取某序号元素的操作

 

Status GetElem_L(LinkList &L,inti,ElemType &e){

 

p=L->next,j=1;

 

while(p&&j<i){p=p->next;++j;}

 

if(!p||j>i) return ERROR;

 

e=p->data;

 

return OK;

 

}//GetElem_L

 

5归并两个单链表的算法

 

void MergeList_L(LinkList &La,LinkList&Lb,LinkList &Lc){

 

//已知单链线性表La和Lb的元素按值非递减排列

 

//归并后得到新的单链线性表Lc,元素也按值非递减排列

 

pa=La->next;pb=Lb->next;

 

Lc=pc=La;

 

while(pa&&pb){

 

if(pa->data<=pb->data){

 

pc->next=pa;pc=pa;pa=pa->next;

 

}else{pc->next=pb;pc=pb;pb=pb->next;}

 

}

 

pc->next=pa?pa:pb;

 

free(Lb);

 

}//MergeList_L

 

 

 

 

 

头指针与头结点的区别:

 

头指针只相当于结点的指针域,头结点即整个线性链表的第一个结点,它的数据域可以放数据元素,也可以放线性表的长度等附加信息,也可以不存储任何信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值