Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2226765
  • 博文数量: 556
  • 博客积分: 11457
  • 博客等级: 上将
  • 技术积分: 5973
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 22:33
文章分类

全部博文(556)

文章存档

2013年(22)

2012年(74)

2011年(460)

分类: C/C++

2012-03-17 10:22:09

思路:
1. 找到该结点,并返回
2. 找到该结点的前一个结点
3. 通过参数NODE **pre(结点的指针的指针,即用来存放结点地址的指针)将待删除结点的前一个结点的指针域修改为待修改结点的下一个结点,即存储该结点的地址。
4.删除成功!
 
链表端的功能实现:
步骤1:查找待删除结点,并通过参数修改前一个结点的指针域指向

点击(此处)折叠或打开

  1. NODE * FindNode(LIST *l,void *key,int (*compare)(void *,void *),NODE **pre) //函数指针
  2. {
  3.       NODE *p=NULL;
  4.      if(l==NULL||key==NULL||compare==NULL||pre==NULL)
  5.          return NULL;
  6.      p=l->head;
  7.      *pre=NULL;
  8.      while(p)
  9.      {
  10.          if(compare(p->data,key)==1)
  11.              return p;
  12.          *pre=p;
  13.          p=p->next;
  14.      }
  15.      return NULL;
  16. }
步骤2:删除结点

点击(此处)折叠或打开

  1. int DeleteListByKey(LIST *l,void *key,int (*compare)(void *,void *))
  2. {
  3.      NODE *p=NULL,*q=NULL;
  4.      p=FindNode(l,key,compare,&q);
  5.      if(p==NULL) //没找到
  6.          return 0;
  7.      if(q==NULL) //删除第一个结点
  8.      l->head=p->next;
  9.      else
  10.          q->next=p->next;

  11.      if(p==l->last)
  12.          l->last=q;
  13.          free(p->data);
  14.          free(p);
  15.          l->length--;
  16.      return 1;
  17. }
应用层的调用:
首先定义根据什么条件删除以及要删除的元素。

点击(此处)折叠或打开

  1. 定义删除条件
  2. --------------------------------------
  3. int CompareBySno(void *info,void *key)
  4. {
  5.      struct STU *stu=(struct STU *)info;
  6.      char *sno=(char *)key;
  7.      return strcmp(stu->sno,sno)==0 ? 1:0;
  8. }
客户端的调用:

点击(此处)折叠或打开

  1. void main()
  2. {
  3.     int i;
  4.     NODE *res=NULL; //定义临时的指针来存放返回的结果
  5.     char name[]="wang wu",sno[]="S101";
  6.     LIST *list=InitList();
  7.     for(i=0;i<3;i++)
  8.      InsertList(list,&s[i],sizeof(s[i]));
  9.     
  10.     
  11.      res=FindNodeByKey(list,name,CompareByName); //函数名称就代表了这个函数的首地址
  12.      if(res==NULL) //函数参数传递错误或者是没找到
  13.          printf("Not Find!\n");
  14.      else
  15.          printf("Find!\n");
  16.      if(DeleteListByKey(list,sno,CompareBySno))
  17.          printf("delete success!\n");
  18.      else
  19.          printf("delete fail!\n");
  20.     
  21. }
分析:(查看内存方式)
删除前:


删除后:

观察头指针和尾指针所指向的结点即可发现指定结点已经被删除掉了。
阅读(7546) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

alexhak20042012-03-20 16:51:55

为啥要两次遍历啊,一次不可以吗?直接找到要删除节点的下一个节点