工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4496|回复: 9

对给定的单链表L, 编写一个删除L中值为x的结点的直接前驱结点的算法

[复制链接]
发表于 2006-9-16 17:08 | 显示全部楼层 |阅读模式
如题
谢谢哦! :hug:

相关帖子

发表于 2006-9-16 17:29 | 显示全部楼层
delete(SqList &L)
{
SqList p,q;
p=L->next;
while(p->next->data!=x && p)
     p=p->next;
q=p->next;
p=q->next;
delete q;
}
回复

使用道具 举报

发表于 2006-9-16 18:05 | 显示全部楼层


  1. int delPreByVal(int v){
  2. /*特殊情况为要删的是头元素时*/
  3.     TList *tmp,*ptr;
  4.     printf("Enter del function!");
  5.     ptr=head;
  6.     tmp=ptr;
  7.     while(ptr->next!=NULL){
  8.         if(ptr->next->value==v){
  9.             if(head->next==ptr){
  10.                 head=ptr->next;
  11.                 break;
  12.             }else{
  13.                 tmp->next=ptr->next;
  14.                 free(ptr);
  15.                 break;
  16.             }
  17.         }
  18.         tmp=ptr;
  19.         ptr=ptr->next;
  20.     }
  21. }
复制代码

[ 本帖最后由 iptton 于 2006-9-16 18:12 编辑 ]
回复

使用道具 举报

发表于 2006-9-16 18:13 | 显示全部楼层
完整例子:

  1. /*  HELLO.C -- Hello, world */

  2. #include "stdio.h"
  3. #include "conio.h"
  4. typedef struct list{
  5.    int value;
  6.    struct list * next;
  7. }TList;
  8. int  delPreByVal(int value);
  9. TList * setRandomValue(int account);
  10. void showAll();
  11. TList * head;
  12. main()
  13. {
  14.     int v;
  15.     head = setRandomValue(10);
  16.     printf("Befor del:");
  17.     showAll();
  18.     printf("Enter the value:");
  19.     scanf("%d",&v);
  20.     delPreByVal(v);
  21.     printf("After del:");
  22.     showAll();
  23.     getch();
  24. }
  25. /*建立链表*/
  26. TList * setRandomValue(int j){
  27.     int tmp;
  28.     TList *head=(TList *)malloc(sizeof(struct list));
  29.     TList *ptr=head;
  30.     if(j<1)return NULL;
  31.     do{
  32.         srand(j);
  33.         tmp=rand();
  34.         ptr->value=tmp;
  35.         ptr->next=(TList *)malloc(sizeof(struct list));
  36.         ptr=ptr->next;
  37.         ptr->next=NULL;
  38.     }while(j--);
  39.     return head;
  40. }
  41. int delPreByVal(int v){
  42. /*特殊情况为要删的是头元素时*/
  43.     TList *tmp,*ptr;
  44.     printf("Enter del function!");
  45.     ptr=head;
  46.     tmp=ptr;
  47.     while(ptr->next!=NULL){
  48.         if(ptr->next->value==v){
  49.             if(head->next==ptr){
  50.                 head=ptr->next;
  51.                 break;
  52.             }else{
  53.                 tmp->next=ptr->next;
  54.                 free(ptr);
  55.                 break;
  56.             }
  57.         }
  58.         tmp=ptr;
  59.         ptr=ptr->next;
  60.     }
  61. }
  62. void showAll(){
  63.     TList *tmp=head->next;

  64.     while(tmp!=NULL){
  65.         printf("%d ",tmp->value);
  66.         tmp=tmp->next;
  67.     }
  68. }
复制代码


在WIN TC 下测试通过
回复

使用道具 举报

发表于 2006-9-20 23:20 | 显示全部楼层
原帖由 海上飞洪 于 2006-9-16 17:29 发表
delete(SqList &L)
{
SqList p,q;
p=L->next;
while(p->next->data!=x && p)
     p=p->next;
q=p->next;
p=q->next;
delete q;
}

好像有错.
如果P指向null,p->next会指向野地址.
:time:

而且这里总会delete q的.但实际上有可能不存在这样的结点的.

[ 本帖最后由 hjack 于 2006-9-20 23:27 编辑 ]
回复

使用道具 举报

发表于 2006-9-20 23:24 | 显示全部楼层

回复 #1 mzozm 的帖子

对于有头结点的链表L

p = q = L;
while( p->next && p->next->value!=x ){
  q = p;
  p = p->next;
}
if ( q!=L && p->next!=NULL ){
  q->next = p->next;
  delete p;
}
回复

使用道具 举报

发表于 2006-9-20 23:44 | 显示全部楼层
为什么两位都直接把要删除头节点的情况跳过不做处理的?
回复

使用道具 举报

发表于 2006-9-21 01:43 | 显示全部楼层
其实头节点也可当作不是任何节点的直接前驱结点.
所以,当 head->next->value==v 时,可认为无直接前驱结点.
那两位可能是这样考虑的.
回复

使用道具 举报

发表于 2006-9-22 00:51 | 显示全部楼层
为了回答IP,特翻了翻数据结构.
"有时我们在单链表的第一个结点之前附设一个结点.称之为头结点.头结点的数据域可以不存储任何信息,也可存表的长度等信息,头结点的指针域存储指向第一个结点的指针."
所以这个头结点是不删的.也就是说真正存数据的是第二个结点开始的.
回复

使用道具 举报

发表于 2006-9-22 11:54 | 显示全部楼层
原来是基础知识没掌握。。。

书上对链表的定义与我脑中的定义有出入。。。。

呵呵(看来要认真点把数据结构看上几次才行。。。)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 07:10

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表