| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 597 人关注过本帖
标题:求助:单链表删除和添加问题!!!!!!/*
只看楼主 加入收藏
追忆似水年华
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-8-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
求助:单链表删除和添加问题!!!!!!/*
/*
 * File:   node.c
 * Author: 叶军
 *
 * Created on 2010年8月2日
 */

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define      NAME_LEN    (10)
typedef struct node
                 {
                  char  name[NAME_LEN];
                  int   count;
                  struct node * next;
                }Node;
 Node *Select=NULL ,*head=NULL,*it=NULL,*temp1=NULL;
  /*******************************************
 *函数名:Node *delet( Node * d_head, char  d_name[])
 *传入参数:Node * d_head, char  d_name[]
 *传出参数:d_head地址
 *函数功能:如果候选人新增票数为-1,则暂时删除该候选人
 *
 ********************************************/
 Node *delet( Node * d_head, char  d_name[])
 {
      Node *d_it=d_head;
      Node *d_it2=NULL;
     // Node *d_it3=d_head;

     while(d_it)
     {
         if(strcmp(d_head->name,d_name) == 0)                    //删除头结点
         {
             d_head = d_head->next;
             free(d_it);
             break;
         }
         d_it2=d_it;
         d_it=d_it->next;
         if(strcmp(d_it->name,d_name) == 0)                       //删除其他结点
         {
             d_it2->next=d_it->next;
             free(d_it);
             break;
         }

     }
      return  d_head;
 }
 /*******************************************
 *函数名:Node *creat( )
 *传入参数:void
 *传出参数:head地址
 *函数功能:如果之前已经有改候选人名字,则累加票数,否则创建新
 *的候选人如果候选人新增票数为-1,则调用delet函数暂时删除该候选人
 *
 ********************************************/
 Node *creat( )
 {
     char array[NAME_LEN]={0},number=0,flag=0;
     Node *temp=NULL ;
    // printf("21\n");
     if(head == NULL)
     {
         Select=(Node *)malloc(sizeof(Node));
         memset(Select ,0,sizeof(Node));
         head = Select;
         temp1=Select;
       //  printf("24\n");
         printf("输入候选人的名字:\n");
         scanf("%s",Select->name);
         printf("输入候选人的票数:\n");
         scanf("%d", &Select->count);
   
     }
     else
     {     
           //  printf("35\n");
             printf("输入候选人的名字:\n");
             scanf("%s",array);
             printf("输入候选人的票数:\n");
             scanf("%d", &number);
             if(-1 == number)
             {
             head=delet( temp1,array);
             }

              for(temp=head; temp; temp=temp->next)     //如果输入的名字和已有的名字相同,且输入的票数不为 -1,则累加票数
             {
                 //printf("45\n");
                 if(strcmp(temp->name,array) == 0 && number != -1)
                 {
                     temp->count+=number;
                     flag=1;
                    
                     break;
                 }
                 
             }
            if(0 == flag )
            {
           //  printf("53\n");
             Select=(Node *)malloc(sizeof(Node));
             memset(Select ,0,sizeof(Node));
             strcpy(Select->name,array);
             Select->count = number;
              it->next=Select;
            }
     }
     it=Select;
      for(temp=head; temp; temp=temp->next)
     {
         // printf("63\n");
         printf("候选人的名字:%s  候选的人的票数:%d\n",temp->name,temp->count);
     }
    // printf("66\n");
     return   (head);
 }

int main(void)
{
    Node *m_select=NULL;
    char a[9]={0};
    while(1)
    {
    printf("请选择继续投票:yes or no\n");
    scanf("%s",a);
    if(a[0] == 'n')
    {
    break;
    }
    head=creat( );
    //m_head1=print(m_head );
    }
    while(head)
    {
        m_select = head;
        head = head->next;
        free(m_select);
    }
    return (0);
}

这是我写的一段代码,是个投票程序投票程序:
1,使用链表实现统计
2,每次输入一个候选人字符串名字和一个整形票数
3,如果之前已经有改候选人名字,则累加票数,否则创建新的候选人
4,如果候选人新增票数为-1,则暂时删除该候选人
5,投票结束后打印所有候选人及其票数
6,要特别注意删除链表头结点位置候选人的情况
程序有写问题,不能准确的删除!多多指教!!
搜索更多相关主题的帖子: 单链 删除 
2010-08-03 17:07
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:20 
怎么这么多人问这个问题的啊,中午刚解答了一个。自己去看吧:

https://bbs.bccn.net/thread-314668-1-1.html
2010-08-03 17:54
追忆似水年华
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-8-3
收藏
得分:0 
回复 2楼 erikyo
他是我同学,我也碰到了一些问题,不知道错在哪儿啊
2010-08-03 17:59
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
/*
* File:   node.c
* Author: 叶军
*
* Created on 2010年8月2日
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  NAME_LEN  10

typedef struct node
 {
     char  name[NAME_LEN];
       int   count;
       struct node * next;
   }Node;

Node *Select=NULL ,*head=NULL,*it=NULL,*temp1=NULL;

  /*******************************************
*函数名:Node *delet( Node * d_head, char  d_name[])
*传入参数:Node * d_head, char  d_name[]
*传出参数:d_head地址
*函数功能:如果候选人新增票数为-1,则暂时删除该候选人
*
********************************************/
Node *delet( Node *d_head, char d_name[])
{
      Node *d_it=d_head;
      Node *d_it2=NULL;
     // Node *d_it3=d_head;

     while(d_it)
     {
         if(strcmp(d_head->name,d_name) == 0)                    //删除头结点
         {
             d_head = d_head->next;
             free(d_it);
             break;
         }
         
         d_it2=d_it;
         d_it=d_it->next;
         if(strcmp(d_it->name,d_name) == 0)                       //删除其他结点
         {
             d_it2->next=d_it->next;
             free(d_it);
             break;
         }

     }
      return  d_head;
}
  
/*******************************************
*函数名:Node *creat( )
*传入参数:void
*传出参数:head地址
*函数功能:如果之前已经有改候选人名字,则累加票数,否则创建新
*的候选人如果候选人新增票数为-1,则调用delet函数暂时删除该候选人
*
********************************************/
Node *creat( )
{
     char array[NAME_LEN]={0},number=0,flag=0;
     Node *temp=NULL ;
    // printf("21\n");
     if(head == NULL)
     {
         Select=(Node *)malloc(sizeof(Node));
         memset(Select ,0,sizeof(Node));
         head = Select;
         temp1=Select;
       //  printf("24\n");
         printf("输入候选人的名字:\n");
         scanf("%s",Select->name);
         printf("输入候选人的票数:\n");
         scanf("%d", &Select->count);
       }
     
     else
     {     
           //  printf("35\n");
             printf("输入候选人的名字:\n");
             scanf("%s",array);
             printf("输入候选人的票数:\n");
             scanf("%d", &number);
             if(-1 == number)
             {
                     head=delet( temp1,array);
                     goto State;                        //这个地方必须要跳出,不然会一直往下执行代码
             }

              for(temp=head; temp; temp=temp->next)     //如果输入的名字和已有的名字相同,且输入的票数不为 -1,则累加票数
             {
                 //printf("45\n");
                 if(strcmp(temp->name,array) == 0 && number != -1)
                 {
                     temp->count+=number;
                     flag=1;
                    
                     break;
                 }
                 
             }
            if(0 == flag )
            {
           //  printf("53\n");
             Select=(Node *)malloc(sizeof(Node));
             memset(Select ,0,sizeof(Node));
             strcpy(Select->name,array);
             Select->count = number;
             Select->next = NULL;                                //指针要置空
             it->next=Select;
            }
     }
     it=Select;

State:
      for(temp=head; temp; temp=temp->next)
     {
         // printf("63\n");
         printf("候选人的名字:%s  候选的人的票数:%d\n",temp->name,temp->count);
     }
    // printf("66\n");
     return   (head);
}

int main(void)
{
    Node *m_select=NULL;
    char a[9]={0};
    while(1)
    {
        printf("请选择继续投票:yes or no\n");
        scanf("%s",a);
        if(a[0] == 'n')
        {
            break;
        }
        head=creat( );
    //m_head1=print(m_head );
    }
   
    while(head)
    {
        m_select = head;
        head = head->next;
        free(m_select);
    }
    return (0);
}

收到的鲜花
  • 追忆似水年华2010-08-03 19:26 送鲜花  3朵   附言:细节决定成败,这句说的很不错!尤其想成为 ...
2010-08-03 18:23
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
问题不多,帮你改好了。但是给你点建议,全局变量虽然可以保存一些链表的信息,但是不利于代码的维护和阅读。
应该尽量使用局部变量实现,保留一个记录当前指针位置的全局变量it就可以了,其他都可以用局部变量和函数返回值的方式实现。
2010-08-03 18:28
快速回复:求助:单链表删除和添加问题!!!!!!/*
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015020 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved