本题要求在链表中查找第一个数据域取值为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;
}