6-2 單鏈表元素定位(12 分)
本題要求在鏈表中查找第一個數據域取值爲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
//代碼如下
int ListLocate_L(LinkList L, ElemType x) { //創建一個指向當前節點的指針 LNode* curPtr = L->next; //創建計數器counter,遍歷,若當前節點數據域值=x,返回位置 int counter = 1; //若當前指針next爲空,循環結束 while(curPtr->next != NULL) { if(curPtr->data == x) return counter; //否則,返回0 (爲什麼呢?) else { curPtr = curPtr->next; counter++; } } }