美文网首页
5.5. 在循环单链表中搜索

5.5. 在循环单链表中搜索

作者: 易百教程 | 来源:发表于2018-11-14 09:28 被阅读6次

在循环单链表中搜索需要遍历链表。要在链表中搜索的数据项与链表的每个节点数据匹配一次,如果找到匹配,则返回该数据项的位置,否则返回-1

该算法在C语言中的实现给出如下。

算法

第1步:设置PTR = HEAD
第2步:设置I = 0
第3步:如果PTR = NULL
    提示 内存溢出
    转到第8步
    [IF结束]

第4步:如果IF HEAD → DATA = ITEM
    写入i + 1返回[结束]
第5步:重复第5步到第7步直到PTR-> next!= head
第6步:如果ptr→data = item
    执行 i + 1
        返回
    [IF结束]
第7步:I = I + 1
第8步:PTR = PTR→NEXT
[循环结束]

第9步:退出

示例代码 -

#include<stdio.h>  
#include<stdlib.h>  
void create(int);
void search();
struct node
{
    int data;
    struct node *next;
};
struct node *head;
void main()
{
    int choice, item, loc;
    do
    {
        printf("\n1.Create\n2.Search\n3.Exit\n4.Enter your choice?");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            printf("Enter the item\n");
            scanf("%d", &item);
            create(item);
            break;
        case 2:
            search();
        case 3:
            exit(0);
            break;
        default:
            printf("Please enter valid choice\n");
        }

    } while (choice != 3);
}
void create(int item)
{
    struct node *ptr = (struct node *)malloc(sizeof(struct node));
    struct node *temp;
    if (ptr == NULL)
    {
        printf("OVERFLOW\n");
    }
    else
    {
        ptr->data = item;
        if (head == NULL)
        {
            head = ptr;
            ptr->next = head;
        }
        else
        {
            temp = head;
            while (temp->next != head)
            {
                temp = temp->next;
            }
            temp->next = ptr;
            ptr->next = head;
        }
        printf("Node Inserted\n");
    }

}
void search()
{
    struct node *ptr;
    int item, i = 0, flag = 1;
    ptr = head;
    if (ptr == NULL)
    {
        printf("Empty List\n");
    }
    else
    {
        printf("Enter item which you want to search?\n");
        scanf("%d", &item);
        if (head->data == item)
        {
            printf("item found at location %d", i + 1);
            flag = 0;
            return;
        }
        else
        {
            while (ptr->next != head)
            {
                if (ptr->data == item)
                {
                    printf("item found at location %d ", i + 1);
                    flag = 0;
                    return;
                }
                else
                {
                    flag = 1;
                }
                i++;
                ptr = ptr->next;
            }
        }
        if (flag != 0)
        {
            printf("Item not found\n");
            return;
        }
    }

}

执行上面示例代码,得到以下结果 -

1.Create
2.Search
3.Exit
4.Enter your choice?1

Enter the item
12

Node Inserted

1.Create
2.Search
3.Exit
4.Enter your choice?1

Enter the item
23

Node Inserted

1.Create
2.Search
3.Exit
4.Enter your choice?2

Enter item which you want to search?
12
item found at location 1

相关文章

  • 5.5. 在循环单链表中搜索

    在循环单链表中搜索需要遍历链表。要在链表中搜索的数据项与链表的每个节点数据匹配一次,如果找到匹配,则返回该数据项的...

  • 线性表的链式存储结构2.0

    这篇文章开启线性表的大版本更新2.0----循环链表 单循环链表 由前面关于单链表的介绍我们知道,在单链表中每个结...

  • 02单项循环链表

    [toc] 循环链表 循环链表 就是在单链表的基础上修改而来 单链表是将尾结点的指针指向NULL,循环链表是将尾结...

  • 数据结构与算法-单向循环链表

    循环链表:将单链表中终端结点的指针域由空改成指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链...

  • 双向链表

    双向链表的结构 既然单链表有循环链表,双向链表当然也有双向循环链表,如下图: 问: 双向链表中某个节点p的后继节点...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 5.3. 删除循环单链表开头元素

    要删除循环单链表中的开头节点,需要进行一些指针调整。 在开头有三种从循环单链表中删除节点的方案有以下几种。 情况1...

  • 判断单链表是否有环及寻找环的

    若单链表中存在环,则环肯定在单链表的尾部,如果通过一个指针遍历单链表,最终这个指针会在单链表尾部的环中不断循环,其...

  • 三、数据结构与算法 — 链表

    链表与数组的区别 链表不是连续的 单链表与循环链表 注意链表中的头结点和尾结点。 循环链表从尾可以方便的到头,适合...

网友评论

      本文标题:5.5. 在循环单链表中搜索

      本文链接:https://www.haomeiwen.com/subject/tjrdfqtx.html