菜鸟面试急需解决的问题!今天揭贴!

huan9185 2005-01-09 11:02:46
假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点。
...全文
248 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
02051223 2005-01-09
  • 打赏
  • 举报
回复




这么好的方法啊!
jiantao301 2005-01-09
  • 打赏
  • 举报
回复
顶!!!!!!!!
huan9185 2005-01-09
  • 打赏
  • 举报
回复
谢谢各位的帮助!
xjb12 2005-01-09
  • 打赏
  • 举报
回复
看看这个可以么?我先吃饭去了,88

#include "stdio.h"
#include "stdlib.h"
int num=10;
typedef struct LINK
{
int data;
struct LINK *pnext;
}link;

/* --------------------------------------------
* Function Name: printlink // 函数名
* Function: to print the link //功能描述
* VAR: //参数描述
link p;
* return : N/A //返回值描述
* Create date :2005-1-9
*--------------------------------------------*/
void printlink(link* p)
{
int count=0;
printf(" \nthe link element as follows:\n");

while(p!=NULL)
{
printf("--->%d",p->data);
p=p->pnext;
count++;
if(count%10==0)
printf("\n");
}
}

void deletelink(link* p,int i)
{
link* q;
q=NULL;
q=p;
if(i>=num)
printf("the link node not find \n");
else
{
int c=0;
while(q && c<=i)
{

q=q->pnext;
c++;
while(c>=i)
{
p=q;
q=q->pnext;
c++;
}
}
num--;

}

}
int main()
{
link *head,*s,*r;
r=NULL;
head=NULL;

for(int i=0;i<num;i++)
{
s=(link*)malloc(sizeof(link));
s->data=i;
s->pnext=head;
head=s;
}
printlink(head);
deletelink(head,3);
printlink(head);
return 0;
}
greenteanet 2005-01-09
  • 打赏
  • 举报
回复
我同意半桶水的代码.我觉得这样子可以实现楼主的要求
cxc014 2005-01-09
  • 打赏
  • 举报
回复
p1 = p->next;
p2 = p1->next;
memcpy(p,p1,sizeof(*p));
p->next = p2;
free(p1);
就算不知道链表类型也行
  • 打赏
  • 举报
回复
q = p->next;
r = p;
while(q != NULL)
{
r->data = q->data;
r = q;
q = r->next;
}
delete r;
Roaming_Sheep 2005-01-09
  • 打赏
  • 举报
回复
将后面的节点的数据依次前移,删除尾节点
dongyuanzhang 2005-01-09
  • 打赏
  • 举报
回复
算法告诉你:
1.q = p;
while(q->next)
{q=q->next;i++;}//此时能把其是倒数第几个节点算出来,方便后续操作,也可以不要
2.然后进行内容复制,删除最后一个节点。
aladar 2005-01-09
  • 打赏
  • 举报
回复
看错了...是删除结点啊...
那只知道结点指针是不够的,起码要知道头指针
aladar 2005-01-09
  • 打赏
  • 举报
回复
void DeleteLink(Node* p)
{
if(p->next!=NULL)
DeleteLink(p->next);

free(p);
}
xjb12 2005-01-09
  • 打赏
  • 举报
回复
兄弟,这个符合你的要求么?

#include "stdio.h"
#include "stdlib.h"
int num=10;
typedef struct LINK
{
int data;
struct LINK *pnext;
}link;

/* --------------------------------------------
* Function Name: printlink // 函数名
* Function: to print the link //功能描述
* VAR: //参数描述
link p;
* return : N/A //返回值描述
* Create date :2005-1-9
*--------------------------------------------*/
void printlink(link* p)
{
int count=0;
printf(" \nthe link element as follows:\n");

while(p!=NULL)
{
printf("--->%d",p->data);
p=p->pnext;
count++;
if(count%10==0)
printf("\n");
}
}

void deletelink(link* p,int i)
{
link* q,*r;
q=NULL;
r=NULL;
q=p;
if(i>=num)
printf("the link node not find \n");
else
{
int c=2;/*从2*/
while(q && c<i)
{

q=q->pnext;
c++;
}
if(c=i)
{
// p=q;
if((q!=NULL)&&(q->pnext!=NULL))
{//
r=q->pnext;//
q->pnext=r->pnext; //
free(r);//
}

}
num--;

}
printlink(p);

}
int main()
{
link *head,*s,*r;
r=NULL;
head=NULL;

for(int i=1;i<num;i++)
{
s=(link*)malloc(sizeof(link));
s->data=i;
s->pnext=head;
head=s;
}
printlink(head);
deletelink(head,2);
printlink(head);
return 0;
}

fire_zyn 2005-01-09
  • 打赏
  • 举报
回复
该题目可以防止思维僵化,
好题目!!

fire_zyn 2005-01-09
  • 打赏
  • 举报
回复
回复人: cxc014(zerostr) ( ) 信誉:100 2005-01-09 11:58:00 得分: 0
p1 = p->next;
p2 = p1->next;
memcpy(p,p1,sizeof(*p));
p->next = p2;
free(p1);
就算不知道链表类型也行
==========================================

我没有上机试过,不过,
如果不知道链表节点类型,
无法访问p->data(也可能有很多字段)
那么,如何访问p->next?
怎么知道下一个节点指针名就是next?
既然能够 *p , 那么p就应该不会是 void * p ,
应该预先指定了p的类型,这样才能取出*p 。

我上面写的MyCopy()仅仅表示复制内容的意思,
不一定就是函数原型。

具体怎么实现,还得再想想。

求高手指点。

:-)

fire_zyn 2005-01-09
  • 打赏
  • 举报
回复
不需要循环吧?
大致算法:删除下一个节点。

1、nextNode = p->next ; // 找到下一个节点,题目假设不为NULL

2、MyCopy( p->data , nextNode->data ) ; // 复制内容,具体怎么实现让我再想想。

3、p->next = nextNode->next ; // 把下一个节点的下一个,接在这个节点后面。
// 即使是NULL也不要紧,就当最后一个节点。

3、delete( nextNode ) ; // 去掉下一个节点。

如果有误,请指教。

69,380

社区成员

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

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