免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 999 | 回复: 2
打印 上一主题 下一主题

急,急,在线求助有关链表删除。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-19 19:08 |只看该作者 |倒序浏览
我写了一个从链表中删除某节点的程序,源代码如下:   

  /* deleteoutlist: delete i node from the outlist */

void deletenodeoutlist(linkoutlist *head, int i)
{
    linkoutlist *p,*r,*q;
    int j;
    int k;
    int n;
   
    k = 1;
    n = 0;
    p = head;    /*从开始节点比较*/

if( head != NULL)
  {
         
    j = i-1;
    printf("locate %d node from outlist.\n",j);
         
    while( (p != NULL)&&(k < j))     
     {   
            p = p->;next;
        k ++;
        n ++;
     }  
   
   printf("k=%d,j=%d,n=%d.\n",k,j,n);
   

    if( j == 0)
      {
             printf("2222222outlist.\n";
        q = p;
        head = q->;next;        
        free(q);
     }
     else
     {
         printf("3333333outlist.\n";
         r = p->;next;
         p->;next = r->;next;
         free(r);   
     }
   
  //  if( p == NULL )
   //    free(p);

}   
else
   printf("now outlist is null.\n";
      
}   


运行时发现,当j==0时,不能删除第一个节点。请问我该如何做才能实现该功能?

2。 请问如果要删除整个链表,我在上面的程序的基础上又该怎么办?

论坛徽章:
0
2 [报告]
发表于 2003-09-19 21:09 |只看该作者

急,急,在线求助有关链表删除。

if ( !(p->;next) || k<i-1) return ERROR;

   if ( j==0 )   head=p->;next;  .....

论坛徽章:
0
3 [报告]
发表于 2003-09-25 16:53 |只看该作者

急,急,在线求助有关链表删除。

很遗憾!有的事情还得靠自己呀.欢迎正在学习链表的朋友进来一看.特别是有链表困惑的朋友.

以下是一个从链表中删除某节点的程序.我以在linux下测试过.代码如下:

typedef struct outnode
{
  char saddr[16];
  double length;
  struct outnode * next;
}linkoutlist;


/* 输出out链表 */

void printfoutlist(linkoutlist *head)
{
    linkoutlist *p;
    int n;
   
    n = 0;  
    p = head;
    if(head != NULL)
      while( p != NULL)
        {
                 n++;
                 printf("************printoutlist*************\n";
                 printf("source ip=%s length=%.3f.\n",p->;saddr,p->;length);       
          p = p->;next;
        }
      
    printf("*************************************\n";
    printf("outlist have %d node.\n\n",n);
}






/* deleteoutlist: delete i node from the outlist */

linkoutlist * deletenodeoutlist(linkoutlist *head, int i)
{
    linkoutlist *p,*q,*s;
    linkoutlist *newhead;
    int j;
    int k;
    int n;
   

    k = 1;
    p = head;    /*从开始节点比较*/

if( head != NULL)
  {
         
    j = i-1;
    printf("locate %d node from outlist.\n",j);
         
    while( (p != NULL)&&(k < j))     
     {   
        p = p->;next;
        k ++;
     }  
   
   printf("j=%d,k=%d.\n",j,k);



    if( j == 0)           // 删除第1节点
      {
              printf("删除outlist第1节点.\n";
              if(p->;next == NULL)      //当第1节点后为空
               {
                   printf("j=%d,outlist only 1 node.\n",j);
                   s = head;
                   free(s);
                   newhead = NULL;
               
               }
              else
              {
            printf("j=%d,outlist after 1 node is not NULL.\n",j);
            
            s = head;
            newhead = s->;next;        
            free(s);
            
            q = newhead;
            printfoutlist(q);
         
        }
     }
     else          //删除第2,3,...n节点
     {
         printf("删除outlist第2,3..n节点.\n";
         deleteoutafter(p);
         
         s = head;
         printfoutlist(s);

         newhead = head;
         
     }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP