今天遇上奇怪的事情了。。codebloks运行不了 说sh: .....upexpected ( 我找了半天bug 最后发现竟然连helloword程序都执行不了
后来我觉得 会不会是 project命名的里 O(1) 然后试着把括号去掉。。居然就行了 后来又建工程加上括号 又是那个错。。
太尼馬诡异了。。。
还有就是 linux里面 EOF 是ctrl+d 不是C 记得windows里是c 然后白书里还说过这个问题。。
没看书直接写了 出现了严重的问题。。自己考虑不周到 太不周到了。。
第一个 如果要删除的是末尾的指针怎么办 不能直接删 必须处理倒数第二个的next指针 那只能直接顺序遍历了
还有 如果链表只有一个节点 那应该首先检查到 要删的节点next 是null然后 如果head和delete相等 那么 head要赋值null
代码还是重写把
/*
这个题目太经典了 是刚才自己想到答案的。。
要求写一个函数 参数是头指针和要删除的指针 删除要删的节点
其实不一定要删那个节点
把要删除节点的next的data 赋值给要删的节点 然后要删的节点指向next的next
然后删next
*/
#include<iostream>
#include<cstdio>
using namespace std;
struct Node
{
int data;
Node * next;
Node (int n)
{
data=n;
}
~Node()
{
cout<<"delete node "<<data<<endl;
}
};
//head指针是非常有用的! 如果要删最后一个节点,一定要考虑全面!。。但是题目原型是这么给出的额
void DeleteoNode(Node * head, Node * p_delete)
{
if (!head || !p_delete)
return ;
if(head==p_delete)// 头尾相等 直接删掉 头赋值NULL
{
delete p_delete;
head=NULL;
return ;
}
if(p_delete->next==NULL)//末尾节点 找到前的 然后赋值NULL
{
Node * p = head;
while(p->next!=p_delete)
p=p->next;
p->next=NULL;
delete p_delete;
return ;
}
Node * del=p_delete->next;;
p_delete->data=p_delete->next->data;
p_delete->next=p_delete->next->next;//这里出现bug半天啊。。。p->next已经变了。。用指针一定要小心 要小心
delete del;
del =NULL;
}
int main()
{
int n;
//freopen("/home/gl/in","r",stdin);
Node * p_head=new Node(0);
Node * p=p_head;
Node * p_delete;
while(scanf("%d",&n)!=EOF)
{
p->next=new Node(n);
if(n==5)//假如这里我们要删除 等于5的节点
p_delete=p->next;
p=p->next;
}
p=p_head;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
DeleteoNode(p_head,p_delete);
p=p_head;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
return 0;
}