StarZZZZ5 2021-07-18 22:13 采纳率: 100%
浏览 40
已采纳

怎么实现不了呢?函数都没有进入

/*
有一个带头结点的单链表,设计一个函数找到指定的倒数第k个节点,输出节点值,并返回1,否则返回0,前提不能改变链表,尽可能高效

分析:
    我们可以先统计出总共的节点数count,那么该节点的顺序数num=count-k+1,当然如果k>count,直接返回0,时间复杂度为O(n)
    这里还有另一种更加便捷的方法,只需对链表遍历一次,我们设立两个指针,最开始均指向首节点,然后让q先移动k个节点,之后p
    q同步移动,当q为NULL时,p所在的位置便是倒数第k个节点的位置

*/
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode //定义单链表的节点类型
{
int value; //数据域
struct LNode *next; //指针域
}LNode,*Linklist;

Linklist list_TailInsert(Linklist &L) //采用尾插法建立单链表,正向建立单链表
{
int value; //设元素类型为整型
L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;
LNode *head = L,*rear = L;//head头指针,rear尾指针
printf("请输入链表各节点的值,以9999结束:");
scanf("%d",&value); //输入节点的值
while(value != 9999)//依次创建节点
{
LNode *s;
s = (Linklist)malloc(sizeof(LNode));
s->value = value;
s->next = NULL;
rear->next = s;
rear = s;
scanf("%d",&value);
}
rear->next = NULL;//尾结点指针置空
return L;
}
void Display(struct LNode *L1)
{
struct LNode *p = L1->next;
while (p != NULL)
{
printf("%d ",p->value);
p = p->next;
}
}
int findTheReciprocalk(Linklist &L,int k)
{
LNode *p = L->next,*q = L->next;
while(k-1 != 0)
{
if(p == NULL)
{
printf("输入K值有误!!!");
return 0;
}
p = p->next;
k--;

}
while(p != NULL)
{
    p = p->next;
    q = q->next; 
}
printf("倒数第%d个位置结点的值:%d",k,q->value);
return 1;     

}

int main()
{ struct LNode *L1;
list_TailInsert(L1);
printf("打印单链表:");
Display(L1);
int k;
printf("请输入要查找倒数第几个结点:");
scanf("%d",k);
findTheReciprocalk(L1,k);
return 0;
}

  • 写回答

1条回答 默认 最新

  • a_cainiaoTxl 2021-07-18 23:36
    关注

    修改好了,while(k-1!=0)改成while(k>0),main函数里面输入k那句少了个取地址符号&,应该是scanf("%d", &k);

    
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct LNode //定义单链表的节点类型
    {
        int value; //数据域
        struct LNode *next; //指针域
    }LNode, *Linklist;
    
    Linklist list_TailInsert(Linklist &L) //采用尾插法建立单链表,正向建立单链表
    {
        int value; //设元素类型为整型
        L = (Linklist)malloc(sizeof(LNode));
        L->next = NULL;
        LNode *head = L, *rear = L;//head头指针,rear尾指针
        printf("请输入链表各节点的值,以9999结束:");
        scanf("%d", &value); //输入节点的值
        while (value != 9999)//依次创建节点
        {
            LNode *s;
            s = (Linklist)malloc(sizeof(LNode));
            s->value = value;
            s->next = NULL;
            rear->next = s;
            rear = s;
            scanf("%d", &value);
        }
        rear->next = NULL;//尾结点指针置空
        return L;
    }
    void Display(struct LNode *L1)
    {
        struct LNode *p = L1->next;
        while (p != NULL)
        {
            printf("%d ", p->value);
            p = p->next;
        }
    }
    int findTheReciprocalk(Linklist &L, int k)
    {
        LNode *p = L->next, *q = L->next;
        int d = k;
        while (k > 0)
        {
            if (p == NULL)
            {
                printf("输入K值有误!!!");
                return 0;
            }
            p = p->next;
            k--;
    
        }
        while (p != NULL)
        {
            p = p->next;
            q = q->next;
        }
        printf("倒数第%d个位置结点的值:%d", d, q->value);
        return 1;
    }
    
    int main()
    {
        struct LNode *L1;
        list_TailInsert(L1);
        printf("打印单链表:");
        Display(L1);
        int k;
        printf("请输入要查找倒数第几个结点:");
        scanf("%d", &k);
        findTheReciprocalk(L1, k);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 7月19日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)