分类：电脑/网络-程序设计-C/C++
问题：有一个程序，请大家进来分析一下，多谢先！问题1：下面这个程序，先 
问题1：下面这个，先创建了一个链表，再输出这个链表；（这一段程序，我测试过，是正常的。）然后，删除链表中的一个结点，再次输出这个更改后的链表。（程序编译没问题，但在运行它时，即生成exe文件时，被告知是程序非法操作。）问题2：int* p=NULL       int* t=0;这两个表达式有什么不同吗？ NULL和0在c++是不是一样的？ 请看看哪里出了问题。# include<iostream.h># include<stdlib.h>struct InNode{问题1：下面这个，先创建了一个链表，再输出这个链表；（这一段程序，我测试过，是正常的。）然后，删除链表中的一个结点，再次输出这个更改后的链表。（程序编译没问题，但在运行它时，即生成exe文件时，被告知是程序非法操作。）问题2：int* p=NULL       int* t=0;这两个表达式有什么不同吗？ NULL和0在c++是不是一样的？ 请看看哪里出了问题。# include<iostream.h># include<stdlib.h>struct InNode{  int data;  InNode* next;};////////////////////////////////////////////////////void creat(InNode* &f, int n){  if(n<=0)  {    cout<<"n值无效! 程序终止.";    exit(1);  }  cout<<"请输入n个数:";  int x;  cin>>x;  f=new InNode;  f->data=x;    if(n==1)   {    f->next=NULL;    return;  }  InNode* p=f;  for(int i=0; i<n-1; i++)  {    p->next=new InNode;    p=p->next;    cin>>x;    p->data=x;  }  p->next=NULL;}////////////////////////////////////////////////////void travel(InNode* f){  while(f)  {    cout<<f->data<<", ";    f=f->next;  }  cout<<endl;}////////////////////////////////////////////////////void dellist(InNode* &f){  InNode* p=f;  int x=p->data;  while(x!=3)  {    p=p->next;    x=p->data;  }  InNode* t=p->next;  delete p;  p=t;}////////////////////////////////////////////////////void main(){  InNode* head=NULL;  cout<<"请输入结点数:";  int n;  cin>>n;  creat(head, n);  travel(head);  dellist(head);  travel(head); //这句如果不去掉，程序运行会中止。去掉后就可以了，但为什么？}
回答：void ist(InNode* &f){...InNode* t=p->next;delete p;p=t;}上面这个程序把链表的一个节点删掉后却没有把其它的节点接起来, 楼上的分析很对,应该找到p的前一节点,照你的意思应该是t,然后t->next=p->next;就行了,至于怎么找到t,还要改你的前一个while循环,按你的能力应该很容易就改好了 事实上上面这个函数能运行,只不过链表中的一个节点的next指向了一个没有数据的位置,所以当运行到 void travel(InNode* f){while(f){cout<<f->data<<", ";//程序在这一行会出错,因为f指向那个节点时,里边的数据已经被你delete掉了,所以出错了f=f->next;}...}第二个问题,两种定义是一样的,事实上,经常用C编程的人都知道 , 要使用NULL时,应该在前面先写一句:#define NULL 0