| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2533 人关注过本帖
标题:q是nullptr 位置不同引发程序中断,可觉得这2个位置没什么不同,放到红线会 ...
只看楼主 加入收藏
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
q是nullptr 位置不同引发程序中断,可觉得这2个位置没什么不同,放到红线会出错,放到for就正常了
#include "pch.h"
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
 typedef struct NODE {
    int data;
    struct NODE* pNext;
} NODE,*PNODE;

 //函数声明
 PNODE create_list(void);
 void traverse_list(PNODE pHead);
 bool is_empty(PNODE pHead);
 int length_list(PNODE pHead);
 bool insert_list(PNODE, int pos, int val);  //在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
 bool delete_list(PNODE, int, int *);
 void sort_list(PNODE);
int main()
{
    int val;//被删除节点数据域的值
    PNODE pHEAD = NULL;
    pHEAD = create_list();
    traverse_list(pHEAD);
    sort_list(pHEAD);
    //delete_list(pHEAD, 2, &val);
    //printf("被删除的节点的值为:%d\n", val);
    traverse_list(pHEAD);
    return 0;
}


PNODE create_list() {
    int len;
    int val;
   
    PNODE pHEAD = (PNODE)malloc(sizeof(NODE)); //头指针,指向头节点
    if (NULL == pHEAD) {
        printf("内存创建失败,程序中断 ");
    }
    PNODE phai = pHEAD;
    phai->pNext = NULL;
    printf("请输入创建节点的个数:");
    scanf_s("%d", &len);
    for (int i = 0; i < len; i++)
    {
        printf("请输入第%d个节点的值:", i + 1);
        scanf_s("%d", &val);
        PNODE pNEW = (PNODE)malloc(sizeof(NODE));
        if (NULL == pNEW) {
            printf("内存创建失败,程序中断 ");
        }
            pNEW->data = val;
            phai->pNext = pNEW;
            pNEW->pNext = NULL;
            phai = pNEW;
        
    }
    return pHEAD;
}
void traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext;

    while (NULL != p)
    {
        printf("%d  ", p->data);
        p = p->pNext;
    }
    printf("\n");

    return;
}
int length_list(PNODE Phead) {
    PNODE p = Phead->pNext;
    int len=0;
    while (NULL!=p)
    {
        len++;
        p = p->pNext;
    }
    return len;
}
bool is_empty(PNODE pHead) {
    PNODE p = pHead->pNext;
    if (NULL == p)
        return true;
    else return false;


}
bool insert_list(PNODE Phead, int pos, int val) {
    PNODE p;
    p = (PNODE)malloc(sizeof(NODE));
    p->data = val;
    PNODE t;
    PNODE q=Phead;
    int i = 0;
    while (q!=NULL&&i<pos-1)
    {
        q = q->pNext;
        i++;
    }
    if (q == NULL || i > pos - 1) //注意为pos-1;
        return false;
    t=q->pNext;
    q->pNext = p;
    p->pNext = t;
    return true;



}
bool delete_list(PNODE Phead, int pos, int *val) {
    PNODE q = Phead;
    int i = 0;
    while (q->pNext!= NULL && i < pos - 1)
    {
        q = q->pNext;
        i++;
    }
    if (q->pNext == NULL || i > pos - 1) //注意为pos-1;
        return false;
    *val = q->pNext->data;
    PNODE p= q->pNext;
    q->pNext = q->pNext->pNext;
    free(p);
    p = NULL;
    return true;

}
void sort_list(PNODE Phead) {
    int i, j, t;
    int len = length_list(Phead);
    PNODE p ;
    PNODE q;
    for (i = 0,p= Phead->pNext; i < len - 1; i++, p = p->pNext)
    {
        for (j = i + 1, q= p->pNext; j < len; j++, q = q->pNext)
        {
            if (p->data > q->data)  
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
            
        }
        
    }

    return;
}
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: int data NULL printf return 
2019-02-08 18:13
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
收藏
得分:0 
大一新生跨专业学数据结构,跪求大佬
2019-02-08 18:18
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
收藏
得分:0 
2019-02-08 18:18
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:20 
加到下面会刷新开始节点,单链表访问不可逆,不像数组

剑栈风樯各苦辛,别时冰雪到时春
2019-02-08 18:25
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
收藏
得分:0 
回复 4楼 林月儿
加到下面程序才会正常运行。
2019-02-08 19:54
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
收藏
得分:0 
我知道了
2019-02-08 20:14
battle0219
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-2-8
收藏
得分:0 
如果放在外面初始化,外层循环第一次结束后,p指向第二个节点,q指向最后一个,程序继续运行,让q继续往后指,后面没了,就断。
所以外层循环一次,就要对q初始化一次,q每次要初始化为p的后一个

2019-02-08 20:18
快速回复:q是nullptr 位置不同引发程序中断,可觉得这2个位置没什么不同,放到 ...
数据加载中...
 
   



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

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