首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

非法访问了吧,可是不知道哪儿非法访问了!求指教

2012-09-28 
非法访问了吧,可是不知道哪里非法访问了!求指教!#include iostreamusing namespace stdstruct Node{lon

非法访问了吧,可是不知道哪里非法访问了!求指教!
#include <iostream>
using namespace std;

struct Node
{
  long no;//学号
  float score;
  Node *next; 
}; 

void DeleteNode(Node *h)
{
  Node *p = h->next;
  Node *q = p->next;
  while (p)
  {
  delete p;
  p = q;
  q = p->next;
  }
}
void CreateList(Node *head, int num)
{
  //创建头结点 
  head = new Node;
  head->next = NULL;
  
  int i = 1;
  Node *p = head, *q;
  while (i++ <= num)
  {
  p = new Node;  
  cin >> p->no >> p->score;
   
  if (head->next == NULL)
  {
p->next = NULL;
head->next = p;
  }
  else 
{
q = head;
  while (p->no < q->next->no)
  q = q->next;
  p->next = q->next;
q->next = p;  
}
 
  }  
}

void mergeList(Node *ha, Node *hb)
{
  Node *pa = ha->next, *pb = hb->next;
  Node *hc = new Node;
  hc->next = NULL;
  Node *pc = hc;
  
  while (pa && pb)
{
if (pa->no >= pb->no)
{
pc->next = pb;
pc = pb;
pb = pb->next;  
}
else if (pa->no < pb->no)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}  
}
 
if (pa)
{
pc->next = pa; 
  } 
  if (pb)
  pc->next = pb;
   
  pc = hc->next;
  while (pc)
  {
cout << pc->no << " " << pc->score << endl;
pc = pc->next;
  }
   
  delete hb;
  delete ha;
  DeleteNode(hc);
  
}

int main()
{
 Node *ha, *hb;
int n, m;

cin >> n >> m;
CreateList(ha, n);
CreateList(hb, m);  
mergeList(ha, hb);

system("pause");
 return 0;
}


[解决办法]
void DeleteNode(Node *h)
{
Node *p = h->next;
Node *q = p->next;
while (p)
{
delete p;
p = q;
q = p->next;
}
}


你的p指针不是已经删除了嘛?怎么再去传值呢?
[解决办法]
单步调试
[解决办法]
不是p被delete了,而是p指向的内存被delete了。

p指向的内容被deleted后,那么p指向的内存就是无效的内存。。。

但是p可以在被赋值啊。
[解决办法]

C/C++ code
void DeleteNode(Node *h){      Node *p = h->next;      Node *q = p->next;      while (p)      {  delete p;  p = q;  [color=#FF0000]q = p->next;[/color]  }}
[解决办法]
CreateList(ha, n);
CreateList(hb, m); 
创建就不会成功,你传递ha进去,但是里面申请的内存并没有给实际的ha,而是给了形参head,所以创建完后你的实际ha还是空指针,合并时肯定非法了。用二级指针或者返回头节点吧。
[解决办法]
while (p->no < q->next->no)


q = q->next;
创建时,运行到这儿已经异常了,不用说创建不成功后的事了。
单步调的这儿看看,而且头指针为什么要单独new一个出来,直接指向第一个元素不就好了?
[解决办法]

探讨

不是p被delete了,而是p指向的内存被delete了。

p指向的内容被deleted后,那么p指向的内存就是无效的内存。。。

但是p可以在被赋值啊。

热点排行