链表访问越界

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;
}
...全文
305 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 没有赋值。

70,021

社区成员

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

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