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

huan9185 2005-01-09 11:02:46
假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点。
...全文
266 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 ) ; // 去掉下一个节点。

如果有误,请指教。

课程特色: 1、面向企业需求: 整个BF-TECH3.0 涵盖了企业急需的客户端技术+数据库技术+C/S开发技术+B/S开发技术 四大方向技术全面、权威、系统、完整、专业、前沿 2、强调技能的实用性: 实用原则:不求全求广,避华而不实,求精求专,选择实际工作中常用的实用的技术、重点讲解企业开发中80%的时间在使用的20%的技术上逐步深入讲解:而非一 步到位,对核心技术折分在不同的阶段讲解,以求学习效果的最大化 随用随讲:对于部分技能,第一次讲解时只介绍基本的,常用的技术细节,其他技术细节将在案例、项目中需要时再进行讲解 3、以实际案例为主线组织教学内容: 采用实际案例组织技术内容一个案例几乎贯穿整门课程 4、以项目经验为学习目标: 项目经验体现在调试能力、业务能力和工作流程三方面 5、技术的前沿性: 如使用的开发环境为VS2010,.net 4.0类库,SQL erver2008,LinQ技术,.net MVC3.0,jquery,extjs,Silverlight4等富客户端技术等,保证了技术在三年之内不会落伍 6、首次采用: 视频授课+上机课作业练习+上机课作业讲解+预习任务布置+ 每讲后涉及常见企业面试题讲解+指导学习课总结复习技能点+ 课程学习效果测试+阶段项目强化技能+毕业设计大型项目演练获取项目经验+前沿技术课扩展技能 (1加9)多模式视频教学方式手把手的教学员由浅入深的掌握软件开发整套流程及专业软件开发技能,使你从一技术菜鸟成为具有丰富开发经验的专业软件工程师 7、技能的全面性与专业性: 整个讲座涉及软件开发主流四大技术 .NET技术+java技术+数据库技术+客户端技术 8、强调动手能力与项目能力: 整个3个阶段结束后,阶段项目+毕业设计项目大小计26个左右,内容涉及MIS、招聘网、CRM、系统集成、物流、进销存、电子政务、网站建设等多个方面。编码将近100000

70,023

社区成员

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

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