单链表元素定位

来源:互联网 发布:剑网三苍云捏脸数据 编辑:程序博客网 时间:2024/06/05 08:38

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   -2typedef 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;}/* 请在这里填写答案 */

输入样例:

41 2 3 41

输出样例:

1

以下是代码:

#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   -2typedef 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 ListLocate_L(LinkList L,ElemType x){    LNode *p = L->next;    if(p == NULL)        return ERROR;    //考虑空表情况    int cnt = 1;    while(p && p != NULL)    {        if(x == p->data)//避免落下等号,如果是x=p->data会报错            return cnt;        ++cnt;        p = p->next;    }}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;}
以上。

原创粉丝点击