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

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

6-35 單鏈表元素定位 (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)
{
    LinkList p = L->next;
    int j = 1;
    while(p&&p->data!=x)
    {
        p = p->next;
        j++;
    }
    if(!p)
        return 0;
    else
        return j;
}