链表访问越界

axiqia 2015-10-18 10:07:45
代码如下:用来计算高精度PI
问题:Codeblocks运行正常,正常输入输出,VS2010报错,PI.exe 中的 0x01371646 处最可能的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突
我自己的想法:双向列表头和尾我利用同一个节点来保存,且头尾不保存数据,那么tail的pre当是第一个有效节点,且在while中循环条件是pre非空,应该不会出现没有初始化的错误,但是VS还是有错误。还请指正。
#include <iostream>
#include <string.h>
#include <cstdio>
#include <stdlib.h>

using namespace std;
struct Node
{
int data;
struct Node *next;
struct Node *pre;
};
typedef struct Node Node, *PNode;
struct FrontNode
{
PNode head;
PNode tail;
};
typedef FrontNode DuLink, *PDuLink;
/******************************/
/* 建立 */
/******************************/

void CreateList(DuLink *h)
{

h->head = h->tail = (PNode)malloc(sizeof(Node));
h->head->data = 0;

PNode p = h->head;
for(int i = 0; i < 600; i++)
{
PNode q;
q = (PNode)malloc(sizeof(Node));
q->data = 0;

p->next = q;
q->pre = p;
p = q;
}
h->tail = p;
}

int main()
{
DuLink sum;
CreateList(&sum);
DuLink rn;
CreateList(&rn);

// rn.tail->pre->data = 2;
// sum.tail->pre->data = 1;
rn.head->next->data = 2;
sum.head->next->data = 2;
for(int n = 1; n < 2000; n++)
{
PNode p = rn.tail->pre, q;
int ret = 0;
while(p!=NULL)
{
int temp = (p->data*n+ret);
//cout << temp << endl;
p->data = temp%10;
ret = temp/10;
p = p->pre;
}
//cout << "乘法" << endl;
p = rn.head->next;
ret = 0;
while(p)
{
int temp = p->data+ret*10;
p->data = temp/(2*n+1);
ret = temp%(2*n+1);
p = p->next;
}
//cout << "除法" << endl;
p = rn.tail->pre;
q = sum.tail->pre;
ret = 0;
while(q)
{
int temp = p->data + q->data + ret;
q->data = temp%10;
ret = temp/10;
p = p->pre;
q = q->pre;
}
//cout << "加法" << endl;
}
PNode p = sum.head->next;
int k;
cin >> k;
int cnt = 0;
while(cnt <= k)
{
if(cnt == 0)
cout << p->data << ".";
else
cout << p->data;
p = p->next;
cnt++;
}
cout << endl;
}
...全文
390 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
axiqia 2015-11-27
  • 打赏
  • 举报
回复
附代码
#include <iostream>
#include <string.h>
#include <cstdio>
#include <stdlib.h>

using namespace std;
struct Node
{
	int data;
	struct Node *next;
	struct Node *pre;
};
typedef struct Node Node, *PNode;
struct FrontNode
{
	PNode head;
	PNode tail;
};
typedef FrontNode DuLink, *PDuLink;
/******************************/
/*			   建立           */
/******************************/

void CreateList(DuLink *h)
{

	h->head = (PNode)malloc(sizeof(Node));
	h->tail = (PNode)malloc(sizeof(Node));
	h->head->pre = NULL;
	h->head->next = NULL;
	h->tail->pre = NULL;
	h->tail->next = NULL;
	h->head->data = 0;

	PNode p = h->head;
    for(int i = 0; i < 600; i++)
    {
        PNode q;
        q = (PNode)malloc(sizeof(Node));
        q->data = 0;

        p->next = q;
        q->pre = p;
        p = q;
    }
    h->tail = p;
}

int main()
{
    DuLink sum;
    CreateList(&sum);
    DuLink rn;
    CreateList(&rn);

//    rn.tail->pre->data = 2;
//    sum.tail->pre->data = 1;
    rn.head->next->data = 2;
    sum.head->next->data = 2;
    for(int n = 1; n < 2000; n++)
    {
        PNode p = rn.tail->pre, q;
        int ret = 0;
        while(p!=rn.head)
        {
            int temp = (p->data*n+ret);
            //cout << temp << endl;
            p->data = temp%10;
            ret = temp/10;
            p = p->pre;
        }
        //cout << "乘法" << endl;
        p = rn.head->next;
        ret = 0;
        while(p!=rn.tail)
		{
            int temp = p->data+ret*10;
            p->data = temp/(2*n+1);
            ret = temp%(2*n+1);
            p = p->next;
        }
        //cout << "除法" << endl;
        p = rn.tail->pre;
        q = sum.tail->pre;
        ret = 0;
        while(q!=sum.head)
        {
            int temp = p->data + q->data + ret;
            q->data = temp%10;
            ret = temp/10;
            p = p->pre;
            q = q->pre;
        }
        //cout << "加法" << endl;
    }
    PNode p = sum.head->next;
    int k;
    cin >> k;
    int cnt = 0;
    while(cnt <= k)
    {
        if(cnt == 0)
            cout << p->data << ".";
        else
            cout << p->data;
        p = p->next;
        cnt++;
    }
    cout << endl;
}
axiqia 2015-11-27
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
head->pre 与 tail->next 没有赋值。
引用 1 楼 fefe82 的回复:
head->pre 与 tail->next 没有赋值。
谢谢,已解决
fefe82 2015-10-18
  • 打赏
  • 举报
回复
head->pre 与 tail->next 没有赋值。
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧