望处雨收云断秋 2023-12-16 21:51 采纳率: 77.8%
浏览 5
已结题

c语言链表的相关知识提问

img


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ListNode {
    int num;
    struct ListNode *next;
}Node;

Node *createlist(); /*根据用户输入的整数n,创建具有n个结点的单链表。裁判实现,细节不表*/
Node *deletelink(Node *head, int i);
void display(Node *head);/*输出链表结点的数据域。裁判实现,细节不表*/

int main(void)
{
    Node  *head;
     int i;
    head = createlist();
     scanf("%d",&i);
    head = deletelink(head, i);
    display(head);
    return 0;
}

/* 请在这里填写答案 */
//此处开始就是我填写的答案。
Node *deletelink(Node *head, int i)
{
    Node* p=head;
    Node* tail=head;
    int count=0,j=1;
    while(p!=NULL)
    {
        count++;
        p=p->next;
    }
    p=head;
    if(i>count)
    {
        printf("error\n");
    }
    else
    {
        while(j<i)
        {
            j++;
            p=tail;
            tail=tail->next;
        }
        p->next=tail->next;
        return head;
    }
}

同样是一个链表的问题。这里我写的代码提示有个测试点是段错误,没想到。请加以指正。

img

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Insert( List L, ElementType X );

int main()
{
    List L;
    ElementType X;
    L = Read();
    scanf("%d", &X);
    L = Insert(L, X);
    Print(L);
    return 0;
}

/* 你的代码将被嵌在这里 */
//我的答案有测试点发生段错误
List Insert( List L, ElementType X )
{
    List p=L;
    List tail;
    List track;//创建跟踪指针
    tail=(List)malloc(sizeof(struct Node));//
    tail->Data=X;
    tail->Next=NULL;//创建要插入链表
    while(p!=NULL)
    {
        if(p->Data<X)
        {
            track=p;
            p=p->Next;
        }
        else break;
    }//找到插入点
    tail->Next=track->Next;
    track->Next=tail;
    return L;
}

希望可以得到完整详细解答,链表学的不是很懂。

  • 写回答

3条回答 默认 最新

  • 关注

    按照无头节点链表来处理。你的代码中没有判断 i ==1的情况,当i==1时,head节点发生变化,需要更新head节点。用下面的代码试试:

    Node *deletelink(Node *head, int i)
    {
        Node* p=head;
        Node* tail=head;
        int count=0,j=1;
        while(p!=NULL)
        {
            count++;
            p=p->next;
        }
        p=head;
        if(i>count)
        {
            printf("error\n");
        }
        else
        {
            if(i==1)
            {
                p = head;
                head = head->next;
                free(p);
                return head;
            }
            while(j<i)
            {
                j++;
                p=tail;
                tail=tail->next;
            }
            p->next=tail->next;
            return head;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 centos7系统下abinit安装时make出错
  • ¥15 hbuildex运行微信小程序报错
  • ¥50 HAL ADCDMA单次触发转换
  • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步