开天辟地的卷毛 2022-10-21 07:25 采纳率: 83.7%
浏览 46
已结题

单向循环链表的内存问题


//单向循环链表 
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#pragma warning(disable: 4996)
//链表的类型定义 
typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode, * LinkList;
//链表的初始化,创建一个有头空链表。 

//链表的建立 
//头插法 
void Creatlist_head(LinkList L, int n)
{
     LinkList q; int i;
    q = L;
    for (i = 0; i < n; i++)
    {
        LinkList p = (LNode*)malloc(sizeof(LNode));//创建新的节点 
        printf("please input\n");
        scanf("%d", &p->data);//给新节点数据域赋值 
        p->next = q->next;//插入新节点的指针域 ,p->next 是说明 p 的指向,而L->next 是指下一个指针域 
        q->next = p;//插入新节点的指针域 , L->next 是说明 L 的指向

    }

}

//尾插法
void Creatlist_tail(LinkList L, int n)
{
    LinkList q; int i;
    q = L;
    for (i = 0; i < n; i++)
    {
        LinkList p = (LNode*)malloc(sizeof(LNode));
        printf("intput:\n");
        scanf("%d", &p->data);
        q->next = p;//插入新节点的指针域 ,L->next 是说明 L 的指向
        q = p;//保证插入后的新节点一直是尾节点 

    }
    //q->next = NULL;
}
//打印函数 
void printList(LinkList L)
{
    LinkList p;//定义一个指针 
    p = L;//
    printf("output:\n");
    while (p->next != L)//只要不指向指向本身,就没有遍历完 
    {
        printf("%d ", p->next->data);//打印已经检索到的节点的数据 //p->data?
        p = p->next;//顺链操作 
    }
    printf("\n");
}


//删除函数(按值查找)
void deletList(LinkList L, int i)
{
    LinkList p;//定义一个临时指针 
    p = L;
    int k = 100;
    while (p->next != L)//只要遍历的指针不指向头
    {
        if (p->next->data == i)//
        {
            p->next = p->next->next;//
            printf("delete success!\n");
            return;
        }
        if (p->next->data != i)
        {
            p = p->next;
        }
    }
    printf("delete fail\n");

}
int main()
{
    LinkList L;

    L = (LNode*)malloc(sizeof(LNode));//创建新的节点
    L->next = L;//指向本身 

    printf("start Creattail: \n");
    Creatlist_tail(L, 5);
    printf("start Creathead: \n");
    Creatlist_head(L, 5);
    deletList(L, 5);
    printList(L);
    return 0;
}

我想问一下,我这个程序删除链表节点的时候出现内存错误,是什么地方出了问题吗

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-10-21 10:34
    关注

    单向循环链表,尾插法void Creatlist_tail(LinkList L, int n)里少了最尾部插入的结点 p->next = L; ,不然就不是循环链表了,代码里出现的问题,不是删除链表节点的问题,删除结点函数没有问题。修改如下,改动处见注释,供参考:

    //单向循环链表 
    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>
    #pragma warning(disable: 4996)
    //链表的类型定义 
    typedef struct LNode
    {
        int data;
        struct LNode* next;
    }LNode, * LinkList;
    //链表的初始化,创建一个有头空链表。 
    //链表的建立 
    //头插法 
    void Creatlist_head(LinkList L, int n)
    {
        LinkList q; int i;
        q = L;
        for (i = 0; i < n; i++)
        {
            LinkList p = (LNode*)malloc(sizeof(LNode)); 
            printf("please input\n");
            scanf("%d", &p->data);
            p->next = q->next; 
            q->next = p;
        }
    }
    //尾插法
    void Creatlist_tail(LinkList L, int n)
    {
        LinkList q; int i;
        q = L;
        for (i = 0; i < n; i++)
        {
            LinkList p = (LNode*)malloc(sizeof(LNode));
            printf("intput:\n");
            scanf("%d", &p->data);
            q->next = p;
            q = p;
            p->next = L;  //修改
        }
    }
    //打印函数 
    void printList(LinkList L)
    {
        LinkList p;
        p = L;
        printf("output:\n");
        while (p->next != L)
        {
            printf("%d ", p->next->data);
            p = p->next;
        }
        printf("\n");
    }
    //删除函数(按值查找)
    void deletList(LinkList L, int i)
    {
        LinkList p, tmp;//修改
        p = L;
        int k = 100;
        while (p->next != L)
        {
            if (p->next->data == i)
            {
                tmp = p->next;     //修改
                p->next = p->next->next;
                free(tmp);        //修改
                printf("delete success!\n");
                return;
            }
            //if (p->next->data != i) 修改
            //{                       修改
            p = p->next;
            //}                       修改
        }
        printf("find fail\n");   //修改
    }
    int main()
    {
        LinkList L;
        L = (LNode*)malloc(sizeof(LNode));//创建新的节点
        L->next = L;//指向本身 
    
        printf("start Creattail: \n");
        Creatlist_tail(L, 5);
    
        printf("start Creathead: \n");
        Creatlist_head(L, 5);
    
        deletList(L, 5);
        printList(L);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含