1. 程式人生 > >6-2 單鏈表元素定位 (12 分)

6-2 單鏈表元素定位 (12 分)

一個 結點 頭結點 生成 reat clu class 函數接口 turn

本題要求在鏈表中查找第一個數據域取值為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 *temp = L->next;
    int pos=0;
    while(temp!=NULL)
    {
        ++pos;
        if(temp->data == x)
            return pos;
        else
        {
            temp = temp->next;
        }
    }
    return 0;
}

  

6-2 單鏈表元素定位 (12 分)