单链表的查找

对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。
因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。
以下是应用查找算法的一个例子:
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h> /*包含一些字符串处理函数的头文件*/
  4. #define N 10
  5. typedef struct node
  6. {
  7.     char name[20];
  8.     struct node *link;
  9. }stud;
  10. stud * creat(int n) /*建立链表的函数*/
  11. {
  12.      stud *p,*h,*s;
  13.     int i;
  14.     if((h=(stud *)malloc(sizeof(stud)))==NULL)
  15.     {
  16.         printf("不能分配内存空间!");
  17.         exit(0);
  18.     }
  19.     h->name[0]='/0';
  20.     h->link=NULL;
  21.     p=h;
  22.     for(i=0;i<n;i++)
  23.     {
  24.        if((s= (stud *) malloc(sizeof(stud)))==NULL)
  25.         {
  26.             printf("不能分配内存空间!");
  27.             exit(0);
  28.         }
  29.         p->link=s;
  30.         printf("请输入第%d个人的姓名",i+1);
  31.         scanf("%s",s->name);
  32.         s->link=NULL;
  33.         p=s;
  34.     }
  35.     return(h);
  36. }
  37. stud * search(stud *h,char *x) /*查找链表的函数,其中h指针是链表的表头指针,x指针是要查找的人的姓名*/
  38. {
  39.     stud *p; /*当前指针,指向要与所查找的姓名比较的结点*/
  40.     char *y; /*保存结点数据域内姓名的指针*/
  41.     p=h->link;
  42.     while(p!=NULL)
  43.     {
  44.         y=p->name;
  45.        if(strcmp(y,x)==0) /*把数据域里的姓名与所要查找的姓名比较,若相同则返回0,即条件成立*/
  46.            return(p); /*返回与所要查找结点的地址*/
  47.        else
  48.             p=p->link;
  49.     }
  50.    if(p==NULL)
  51.        printf("没有查找到该数据!");
  52. }
  53. main()
  54. {
  55.     int number;
  56.     char fullname[20];
  57.     stud *head,*searchpoint; /*head是表头指针,searchpoint是保存符合条件的结点地址的指针*/
  58.     number=N;
  59.     head=creat(number);
  60.     printf("请输入你要查找的人的姓名:");
  61.     scanf("%s",fullname);
  62.     searchpoint=search(head,fullname); /*调用查找函数,并把结果赋给searchpoint指针*/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值