| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 839 人关注过本帖
标题:麻烦哪位大佬帮我看一下我的代码,调试一半出了问题,可能还有其他问题,下 ...
只看楼主 加入收藏
路人甲3
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2022-9-27
结帖率:100%
收藏
已结贴  问题点数:13 回复次数:5 
麻烦哪位大佬帮我看一下我的代码,调试一半出了问题,可能还有其他问题,下面是我的错误代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    int length = 0;
    struct node* next;
}node,*linklist;
linklist createlist(linklist L) {
    L = (linklist)malloc(sizeof(node));
    L->next = NULL;
    node* p;
    int x;
    printf("请输入十个数字:\n");
    for (int i = 0; i < 10; i++)
    {
        p = (linklist)malloc(sizeof(node));
        scanf("%d", &x);
        p->data = x;
        p->next = L->next;
        L->next = p;
        L->length++;
    }
    return L;
}
int insert(linklist L)
{
    int n, x;
    printf("请输入想插入的结点位置:\n");
    scanf("%d", &n);
    printf("请输入你想插入的数:\n");
    scanf("%d", &x);
    node* p;
    p = (linklist)malloc(sizeof(node));
    p = L;
    int i = 1;
    while (p&&i < n-1)
    {
        p = p->next;
        i++;
    }
    if (!p||i >n - 1)
        printf("无法插入!\n");
    return 0;
    node *r;
    r = (linklist)malloc(sizeof(node));
    r->data = x;
    r->next = p->next;
    p->next = r;
    L->length++;
    return 1;
}
int deletelist(linklist L)
{
    int i;
    printf("要删除第几个数字:");
    scanf("%d", &i);
    node* p, *q;
    int j = 2;
    p = L->next;
    while (p->next && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p->next || j > i)
        printf("第%d个数字不存在!",i);
    q = p->next;
    p->next = q->next;
    free(q);
    return 1;
}
void printlist(linklist L)
{
    linklist p;
    p = L;
    while(p)
    {
        printf("%d", p->data);
        p= p->next;
    }
    printf("\n");
}
int main()
{
    int a;
    linklist L;
    L = (linklist)malloc(sizeof(node));
    createlist(L);
    while (1)
    {
        printf("             请输入操作选项:\n");
        printf("           1插入;2删除;3查看\n");
        scanf("%d", &a);
        switch (a)
        {
        case 1:insert(L);
            break;
        case 2:deletelist(L);
            break;
        case 3:printlist(L);
            break;
        default:printf("输入错误,请重新输入!\n");
            break;
        }
    }
    return 0;
}

调试的时候
printlist函数里面
printf("%d", p->data); 会出现下面的显示:
引发了异常: 读取访问权限冲突。
p 是 0xFFFFFFFFFFFFFFFF。我不理解
搜索更多相关主题的帖子: int next 输入 printf node 
2023-04-16 22:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
typedef struct node{
    int data;
    int length = 0;
语法错误的前提下,你竟然能进行调试?我怀疑你用的是C++编译器,而不是C编译器。
2023-04-17 10:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
不知道你的题目是什么,那我只能根据你的错误代码来猜测题目。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct node_ {
    int data;
    struct node_* next;
} node;

typedef struct list_ {
    size_t length;
    struct node_* head;
} list;

list list_create( void )
{
    list result = { 0, NULL };
    return result;
}

node** list_get( list* L, size_t index )
{
    if( index > L->length )
        return NULL;

    node** result = &L->head;
    for( size_t i=0; i!=index; ++i )
        result = &(*result)->next;
    return result;
}

bool list_insert( list* L, size_t index, int data )
{
    node** pos = list_get( L, index );
    if( !pos )
        return false;

    node* tmp = malloc( sizeof(node) );
    tmp->data = data;
    tmp->next = (*pos);
    (*pos) = tmp;
    ++L->length;
    return true;
}

void list_append( list* L, int data )
{
    list_insert( L, L->length, data );
}

bool list_remove( list* L, size_t index )
{
    node** pos = list_get( L, index );
    if( !pos || !*pos )
        return false;

    node* tmp = *pos;
    *pos = (*pos)->next;
    free( tmp );
    --L->length;
    return true;
}

void list_destroy( list* L )
{
    while( L->length != 0 )
        list_remove( L, L->length-1 );
}

int main( void )
{
    list L = list_create();
    for( ; ; )
    {
        int option;
        printf( "\n*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): " );
        while( scanf("%d",&option)!=1 || option<1 || option>4 )
        {
            scanf( "%*[^\n]" );
            printf( "输入错误,请重新输入: " );
        }
        scanf( "%*[^\n]" );
        if( option == 4 )
            break;

        switch( option )
        {
        case 1:
            {
                printf( "请输入十个数字: " );
                for( size_t i=0; i!=10; )
                {
                    int value;
                    if( scanf("%d",&value) != 1 )
                    {
                        scanf( "%*[^\n]" );
                        puts( "输入错误,请重新输入" );
                    }
                    else
                    {
                        list_append( &L, value );
                        ++i;
                    }
                }
                scanf( "%*[^\n]" );
            }
            break;
        case 2:
            {
                size_t index;
                printf( "要删除第几个数字(索引从0开始计数):" );
                for( ; scanf("%zu",&index)!=1; )
                {
                    scanf( "%*[^\n]" );
                    printf( "输入错误,请重新输入: " );
                }
                scanf( "%*[^\n]" );

                if( !list_remove(&L,index) )
                    printf( "第%zu个数字不存在!\n", index );
            }
            break;
        case 3:
            {
                for( size_t i=0; i!=L.length; ++i )
                    printf( "%d%c", (*list_get(&L,i))->data, " \n"[i+1==L.length] );
            }
            break;
        }
    }
    list_destroy( &L );
}


输出输出
*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): x
输入错误,请重新输入: 1
请输入十个数字:
0
1
2
3
4
5
6
shi shi
输入错误,请重新输入
7
8
9

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 3
0 1 2 3 4 5 6 7 8 9

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 1
请输入十个数字: 10 11 12 13 14 15 16 17 18 19

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 3
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 2
要删除第几个数字(索引从0开始计数):0

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 2
要删除第几个数字(索引从0开始计数):19
第19个数字不存在!

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 2
要删除第几个数字(索引从0开始计数):18

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 2
要删除第几个数字(索引从0开始计数):2

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 3
1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

*** 请输入操作选项(1插入; 2删除; 3查看; 4退出): 4
2023-04-17 10:41
路人甲3
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2022-9-27
收藏
得分:0 
回复 3楼 rjsp
额大佬的代码我貌似很难理解,其实这就是一个简单的单链表插入和删除,我用的是Visual Studio lnstaller软件,编译器没有报错,但调试一半就会跳转到代码里面,说有异常,咋改都还是异常就搞不懂了
2023-04-17 11:36
不会游泳的虾
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:27
帖 子:109
专家分:679
注 册:2021-7-1
收藏
得分:5 
题主的代码修改如下,改动处见注释,供参考:
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    int length;  // int length = 0; 修改
    struct node* next;
}node,*linklist;
linklist createlist(linklist L) {
    //L = (linklist)malloc(sizeof(node)); 此两行多余,应删除
    //L->next = NULL;
    node* p;
    int x;
    printf("请输入十个数字:\n");
    for (int i = 0; i < 5; i++)
    {
        p = (linklist)malloc(sizeof(node));
        scanf("%d", &x);
        p->data = x;
        p->next = L->next;
        L->next = p;
        L->length++;
    }
    return L;
}
int insert(linklist L)
{
    int n, x;
    printf("请输入想插入的结点位置:\n");
    scanf("%d", &n);
    printf("请输入你想插入的数:\n");
    scanf("%d", &x);
    if (n < 1) {                //修改
        printf("无法插入!\n");
        return 0;
    }                           //修改
    node* p;
    //p = (linklist)malloc(sizeof(node)); 修改
    p = L;
    int i = 0;  //i = 1; 修改
    while (p->next && i < n-1) //(p&&i < n-1)
    {
        p = p->next;
        i++;
    }
    if (!p->next && L->next){  //(!p||i >n - 1)修改
        printf("无法插入!\n");
        return 0;
    }               //修改
    node *r;
    r = (linklist)malloc(sizeof(node));
    r->data = x;
    r->next = p->next;
    p->next = r;
    L->length++;
    printf("插入链表成功!\n");
    return 1;
}
int deletelist(linklist L)
{
    int i;
    printf("要删除第几个结点:");
    scanf("%d", &i);
    if (i < 1){                  //修改
        printf("第%d个结点不存在!\n",i);
        return 0;
    }                            //修改
    node* p, *q;
    int j = 0; //j = 2;
    p = L;     //p = L->next; 修改
    while (p->next && j < i - 1) //修改  while (p->next && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p->next){  //(!p->next || j > i) 修改
        printf("第%d个结点不存在!\n",i);
        return 0;   //修改
    }               //修改
    q = p->next;
    p->next = q->next;
    free(q);
    L->length--;               // 修改
    printf("删除结点成功!\n");// 修改
    return 1;
}
void printlist(linklist L)
{
    linklist p;
    if (!L || !L->next) //修改
        printf("NULL");
    else{               //修改
        p = L->next;    //修改
        while(p)
        {
            printf("%d ", p->data);
            p= p->next;
        }
        printf("\n");
    }
}
int main()
{
    int a;
    linklist L;
    L = (linklist)malloc(sizeof(node));
    L->next = NULL;    //修改
    L->length = 0;     //修改
    createlist(L);
    while (1)
    {
        printf("             请输入操作选项:\n");
        printf("           1插入;2删除;3查看\n");
        scanf("%d", &a);
        switch (a)
        {
        case 1:insert(L);
            break;
        case 2:deletelist(L);
            break;
        case 3:printlist(L);
            break;
        default:printf("输入错误,请重新输入!\n");
            break;
        }
    }
    return 0;
}
2023-04-17 18:43
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:5 
你的代码中有两个问题:

在结构体中定义length:不需要在结构体中定义length,应该在主函数中手动记录链表的长度。

insert函数中return语句的位置:return语句应该放在r->next = p->next;的前面,否则代码将会直接退出,导致无法执行该行代码,也就无法完成插入操作了。

对于你提到的问题,出现读取访问权限冲突的错误是因为你在printlist函数中使用了一个空指针,将其作为链表头来操作。具体来说,p指针在while循环中可能已经遍历到了链表的末尾,此时p为NULL,再去使用p->data就会导致访问冲突引发异常。

你应该将p指针初始化为L->next,这样才能正确遍历链表。

修改后的代码如下:

程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    struct node* next;
}node, *linklist;
linklist createlist(linklist L) {
    L = (linklist)malloc(sizeof(node));
    L->next = NULL;
    node* p;
    int x;
    printf("请输入十个数字:\n");
    for (int i = 0; i < 10; i++)
    {
        p = (linklist)malloc(sizeof(node));
        scanf("%d", &x);
        p->data = x;
        p->next = L->next;
        L->next = p;
    }
    return L;
}

int insert(linklist L)
{
    int n, x;
    printf("请输入想插入的结点位置:\n");
    scanf("%d", &n);
    printf("请输入你想插入的数:\n");
    scanf("%d", &x);
    node* p = L->next;
    node* pre = L;
    int i = 1;
    while (p && i < n)
    {
        pre = p;
        p = p->next;
        i++;
    }
    if (!p || i > n)
    {
        printf("无法插入!\n");
        return 0;
    }
    node *r;
    r = (linklist)malloc(sizeof(node));
    r->data = x;
    r->next = p;
    pre->next = r;
    return 1;
}

int deletelist(linklist L)
{
    int i;
    printf("要删除第几个数字:");
    scanf("%d", &i);
    int j = 1;
    node* pre = L;
    node* p = L->next;
    while (p && j < i)
    {
        pre = p;
        p = p->next;
        j++;
    }
    if (!p || j > i)
    {
        printf("第%d个数字不存在!", i);
        return 0;
    }
    pre->next = p->next;
    free(p);
    return 1;
}

void printlist(linklist L)
{
    node* p = L->next;
    while (p)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
}

int main()
{
    int a;
    linklist L;
    L = (linklist)malloc(sizeof(node));
    createlist(L);
    int len = 10; // 手动记录链表的长度
    while (1)
    {
        printf("             请输入操作选项:\n");
        printf("           1插入;2删除;3查看\n");
        scanf("%d", &a);
        switch (a)
        {
        case 1:if (insert(L))
                    len++; // 如果插入操作成功,链表长度+1
            break;
        case 2:if (deletelist(L))
                    len--; // 如果删除操作成功,链表长度-1
            break;
        case 3:printlist(L);
            break;
        default:printf("输入错误,请重新输入!\n");
            break;
        }
    }
    return 0;
}




会当凌绝顶,一览众山小.
2023-04-17 18:49
快速回复:麻烦哪位大佬帮我看一下我的代码,调试一半出了问题,可能还有其他问题 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031463 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved