6-1 删除单链表中最后一个与给定值相等的结点 (10 分)2017年山东科技大学数据结构期末考试题

版权声明:欢迎转载,但转载时请注明原文地址 https://blog.csdn.net/weixin_42110638/article/details/85156400

6-1 删除单链表中最后一个与给定值相等的结点 (10 分)

本题要求在链表中删除最后一个数据域取值为x的节点。L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)执行后,链表中剩余各个节点的数据域取值依次为1 3 1 4 5。

函数接口定义:

void ListLocateAndDel_L(LinkList L, ElemType x);

其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中定位最后一个数据域取值为x的节点并删除之。

裁判测试程序样例:


//库函数头文件包含

#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

#define NULL        0



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;

    for (int i=1;i<=n;i++){

        curPtr=(LNode*)malloc(sizeof(LNode));

        if(!curPtr)exit(OVERFLOW);

        scanf("%d",&curPtr->data);

        curPtr->next=NULL;

        rearPtr->next=curPtr;

        rearPtr=curPtr;

    }

    return OK;

}

//链表输出函数

void ListPrint_L(LinkList L)

{

LNode *p=L->next;

if(!p){

    printf("空表");

    return;

}

while(p!=NULL)

{

       if(p->next!=NULL)

           printf("%d ",p->data);

       else

           printf("%d",p->data);

       p=p->next;

}

}

//下面是需要实现的函数的声明

void ListLocateAndDel_L(LinkList L, ElemType x);



int main()

{

    LinkList L;

    int n;

    int x;

    scanf("%d",&n);  //输入链表中元素个数

    if(ListCreate_L(L,n)!= OK) {

          printf("表创建失败!!!\n");

          return -1;

    }

   scanf("%d",&x); //输入待查找元素

   ListLocateAndDel_L(L,x);

   ListPrint_L(L);

   return 0;

}



/* 请在这里填写答案 */

输入样例:

6

1 3 1 4 3 5

3

输出样例:

1 3 1 4 5

思路:

答案:


void ListLocateAndDel_L(LinkList L, ElemType x)
{
    if(!L)
        return;//表空啥也不干
    else
    {
        LinkList p = L->next,q,t=L;//t指向头结点
        while(p)
        {
            if(p->data==x)
                t = q;//记录并更新相同位置(t也是要删除位置的直接前驱)
            q = p;//这两部就是不等就一直往后更新
            p = p->next;
        }
        if(t!=L)//大概的意思就是t往后移动了,就可以删了(不知道不写这句行不行)
        {
            t->next = t->next->next;//删除操作
        }
    }

}

 

猜你喜欢

转载自blog.csdn.net/weixin_42110638/article/details/85156400