删除双链表的一个结点?

csutzs 2006-03-30 09:52:32
写一个函数 删除一个双链表的一个结点
...全文
213 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
du51 2006-03-30
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
typedef struct NodeTag{
int val;
struct NodeTag *pre,*next;
}Node,*Link;
Link createNode(int val)
{
Link link=(Link)malloc(sizeof(Node));
if(!link)exit(1);
link->val=val;
link->pre=link->next=NULL;
return link;
}
void insertNode(Link *head,int val)
{
Link p=*head,q;
Link newNode=createNode(val);
if(!*head)*head=newNode;
else
{
while(p)q=p,p=p->next;
q->next=newNode;
newNode->pre=q;
}
}
void createLink(Link *head)
{
int val;
printf("请输入数据以-1结束\n");
scanf("%d",&val);
while(val+1)
{
insertNode(head,val);
scanf("%d",&val);
}
}
void showLink(Link head)
{
while(head)
{
printf("%d ",head->val);
head=head->next;
}
printf("\n");
}
void RshowLink(Link head)
{
Link p=head;
if(!p)return;
while(p->next)p=p->next;
while(p)
{
printf("%d ",p->val);
p=p->pre;
}
printf("\n");
}
void delNode(Link *head,int val)
{
Link p=*head,q;
if(!p)return;
while(p)
{
if(p->val==val)
{
if(p==*head)
{
*head=(*head)->next;
if(*head)(*head)->pre=NULL;
free(p);
p=*head;
}
else
{
q=p->pre;
if(p->next)p->next->pre=q;
q->next=p->next;
free(p);
p=q->next;
}
}
else p=p->next;
}
}
void KdelNode(Link *head)
{
int val;
printf("请输入你要删除的值.\n");
scanf("%d",&val);
delNode(head,val);
}
void destroyLink(Link *head)
{
Link p;
while(*head)
{
p=*head;
*head=(*head)->next;
free(p);
}
}
int main()
{
Link head=NULL;
createLink(&head);
showLink(head);
RshowLink(head);
KdelNode(&head);
showLink(head);
RshowLink(head);
destroyLink(&head);
system("PAUSE");
return 0;
}
ricky460 2006-03-30
  • 打赏
  • 举报
回复
//假设链表节点类似如下定义
struct NODE
{
NODE* last ;
NODE* next ;
.......... //其它代码
};

//删除函数
void DelNode(NODE*& pDel)
{
NODE* pLast = pDel->last ;
NODE* pNext = pDel->next ;

pLast->next = pNext ;
pNext->last = pLast ;

delete pDel;
}
michael_g_hu 2006-03-30
  • 打赏
  • 举报
回复
做一个循环,每次保存上一个结点地址,当前结点满足删除条件时,把上个结点的右边指向下个结点,下个结点左边指向上个结点,最后FREE掉就行了
yinqing_yx 2006-03-30
  • 打赏
  • 举报
回复

predelNode->backPtr = delNode->backPtr;
delNode->backPtr->frontPtr=predeNode;
delete deNode;
deNode = 0;
iamcaicainiao 2006-03-30
  • 打赏
  • 举报
回复
作业贴,建议直接用baidu或者google搜一下。
vanlover 2006-03-30
  • 打赏
  • 举报
回复
小测验?
jixingzhong 2006-03-30
  • 打赏
  • 举报
回复
//链表节点定义
struct NODE
{
...
NODE *last, *next ;
... //其它代码
};

//删除节点pDel

void DelNode(NODE *del)
{
(del->last)->next = del->next;
(del->next)->last = del->last;

delete del;
}

69,371

社区成员

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

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