6-2 单链表元素定位 (12 分)

该博客讨论如何在单链表中查找第一个数据域等于给定值的节点,返回其位序。提供的C语言代码实现了一个名为ListLocate_L的函数,该函数遍历链表并返回目标值的位序,不存在则返回0。博客内容包括函数接口定义、裁判测试程序样例以及问题解析,适合初学者复习链表操作和基本算法。
摘要由CSDN通过智能技术生成

本题要求在链表中查找第一个数据域取值为x的节点,返回节点的位序。L是一个带头结点的单链表,函数ListLocate_L(LinkList L, ElemType x)要求在链表中查找第一个数据域取值为x的节点,返回其位序(从1开始),查找不到则返回0。例如,原单链表各个元素节点的元素依次为1,2,3,4,则ListLocate_L(L, 1)返回1,ListLocate_L(L, 3)返回3,而ListLocate_L(L, 100)返回0。

函数接口定义:

int ListLocate_L(LinkList L, ElemType x);

其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中查找第一个数据域取值为x的节点。若找到则返回其位序(从1开始),找不到则返回0。

裁判测试程序样例:


//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int  ElemType; //假设线性表中的元素均为整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status ListCreate_L(LinkList &L,int n)
{
    LNode *rearPtr,*curPtr;   //一个尾指针,一个指向新节点的指针
    L=(LNode*)malloc(sizeof (LNode));
    if(!L)exit(OVERFLOW);
    L->next=NULL;               //先建立一个带头结点的单链表
    rearPtr=L;  //初始时头结点为尾节点,rearPtr指向尾巴节点
    for (int i=1;i<=n;i++){  //每次循环都开辟一个新节点,并把新节点拼到尾节点后
        curPtr=(LNode*)malloc(sizeof(LNode));//生成新结点
        if(!curPtr)exit(OVERFLOW);
        scanf("%d",&curPtr->data);//输入元素值
        curPtr->next=NULL;  //最后一个节点的next赋空
        rearPtr->next=curPtr;
        rearPtr=curPtr;
    }
    return OK;
}
//下面是需要实现的函数的声明
int ListLocate_L(LinkList L, ElemType x);

int main()
{
    LinkList L;
    int n;
    int x,k;   
    scanf("%d",&n);  //输入链表中元素个数
    if(ListCreate_L(L,n)!= OK) {
          printf("表创建失败!!!\n");
          return -1;
    }
   scanf("%d",&x); //输入待查找元素
   k=ListLocate_L(L,x);
   printf("%d\n",k);
   return 0;
}

/* 请在这里填写答案 */

输入样例:

4
1 2 3 4
1

结尾无空行

输出样例:

1

结尾无空行

很简单的小题目,用来复习基本知识点挺不错的;

求一个特定值的位置,其实这个题只能求链表中第一个与给出值相等的数的位置,后边的求不了了。

思路很简单,就是设定一个指向节点的指针,让它指向头节点,如果这个指针的next不是NULL,而且这个指针的数据域不等于我们要找的值,就让指针后移,指针后移就是p = p->next,设置一个计数器,指针每次后移就让计数器加一,如果找不到的话,循环退出的条件就是p->next == NULL,这种情况返回0;退出程序,另一种情况是p的数据域是我们要找的数了,这时候就要返回我们所设的计数器,计数器的数值就是所求的位序了。还有一种很特殊的情况就是,p->next == NULL退出了,但这时,p的数据域也满足条件,这是并不是找不到,所以要返回计数器的数值!

答案如下:

int ListLocate(LinkList L,Elemtype x){
LNode *p;
p = L;
int count = 0;//设置计数器;
while(p->next!=NULL&&p->data!=x){//循环的条件就是链表还没到头并且还没找到我们要找的值;
    count++;//计数器加一
    p = p->next;//指针后移
}
if(p->next!=NULL)//因为找到了要找的值退出
    return count;
else if(p->next == NULL&&p->data != x){//因为指针后移为空退出
    return 0;
}
else if(p->next == NULL&&p->data == x)//指针后移为空但最后一个是我们要找的值
    return count;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值