| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 717 人关注过本帖
标题:小弟是菜鸟,高手帮帮忙,c语言编程遇到问题
只看楼主 加入收藏
yourcandy
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-6-1
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
小弟是菜鸟,高手帮帮忙,c语言编程遇到问题
问题是这样的:
投票程序:
1,使用链表实现统计
2,每次输入一个候选人字符串名字和一个整形票数
3,如果之前已经有改候选人名字,则累加票数,否则创建新的候选人
4,如果候选人新增票数为-1,则暂时删除该候选人
5,投票结束后打印所有候选人及其票数
6,要特别注意删除链表头结点位置候选人的情况


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENTH (20)
typedef struct Node
{
        char name[LENTH];
        int num;
        struct Node *next;
}node;


//定义删除函数
node *dele(node *head, node *p)                                //要删除p这个结点
{
        node *q = NULL;
        if(p==head)                                //如果要删除的为头结点
        {
                q=head;
                head=head->next;                                //将头结点的下一结点置为头结点
                free(q);                                                //释放原来的头结点的内存
        }
        q->next = p;                                                //结点q是p的前结点
        if(p!=head)
        {
                q->next = p->next;
                free(p);
        }
        return head;
}
//定义增加链表长度函数
int add(node *head,char name[LENTH],int num)
{
        node *q = head ,*p = NULL;
        
        while(q->next)                                //找到链表的尾结点
                q=q->next;
        q->next=p;                                        //在链表末尾插入新结点
        strcpy(p->name,name);
        p->num=num;
        p->next=NULL;
        return 0;
}

//定义查找函数
int find(node *head,char name[LENTH],int num)
{
        node *p = NULL,*q = NULL;
        p = head;                                                                //p指向头结点,从头结点开始找
        while(p!=NULL&&p->name!=name)                        //查找姓名为name的候选人,如果当前结点不是要找的结点
                p = p->next;                                                //指针指向下一结点
        if(p->name==name)                                                // 如果找到该候选人的名字
        {
                if(-1!=num)
                        p->num+=num;                                                //则增加相应的票数
                return 1;                                                               
                if(-1==num)
                {                                                                                        //调用删除函数
                        dele(head,p);
                        
                }                                                                                       
        }
        if(p==NULL)
        {
                add(head,name ,num);                                                //调用增加链表长度函数
        }
}
void main()
{
        node *head=NULL, *p=NULL, *q=NULL;
        int i = 0, j = 0;
        while(1)
        {
                printf("输入1投票,输入0结束投票\n");
                scanf("%d",&j);
                if(j==1)
                {
                        q=(node *)malloc(sizeof(node));                                //分配一个新结点空间
                        printf("请输入的候选人的名字和票数:\n");
                        scanf("%s %d",q->name,&q->num);
                        q->next = NULL;                                                                //新结点指针域指向空
                        if(NULL==head)
                        {
                                head = q;
                        
                        }
                        else
                        {
                        
                                i =        find(head, q->name,q->num);
                        
                                if(i == 1)
                                        free(q);
                        }
                }
                else
                        break;
        }
               
        printf("最后结果为:\n");
        for(p=head;p;p=p->next)
                printf("%s %d\n",p->name,p->num);
        while(head)
        {
                p=head;
                head = head->next;
                free(p);
        }
        
}


我在输入张三 1,然后再输入一个名字和票数时就跳出问题了,我在strcpy处设置了断点检查,发现p->name还是没考配进去,求高手帮忙

搜索更多相关主题的帖子: c语言 
2010-08-03 11:02
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:15 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LENTH 20

typedef struct Node
{
        char name[LENTH];
        int num;
        struct Node *next;
}node;


//定义删除函数
node *dele(node *head, node *p)                                //要删除p这个结点
{
        node *q = NULL;
        if(p==head)                                //如果要删除的为头结点
        {
                q=head;
                head=head->next;                                //将头结点的下一结点置为头结点
                free(q);                                                //释放原来的头结点的内存
        }
        
//        q->next = p;                                                //结点q是p的前结点
      else                                //不是头结点的情况
        {
            q =head->next;
        while(q !=NULL && q != p)
        {
            q = q->next;
        }

        if(q == NULL)
            printf("can't find the node!\n");
        else
              {
                    q->next = p->next;
                    free(p);
        }
    }
        return head;
}

//定义增加链表长度函数
int add(node **head, char name[ ], int num)
{
        node *q = *head ,*p = NULL;
     p = (node *)malloc(sizeof(node));            //必须分配空间,不然无法复制(你也发现这个问题了)
     if(NULL == p)
     {
        printf("Error: NULL == p!\n");
        return -1;
     }
     memset(p, 0 ,sizeof(p));
         
     strcpy(p->name,name);
        p->num=num;
        p->next=NULL;
        
        while(q->next)                                    //找到链表的尾结点
                q=q->next;
        q->next=p;                                        //在链表末尾插入新结点
           
        return 0;
}

//定义查找函数
int find(node **head,char name[ ],int num)
{
        node *p = NULL,*q = NULL;
        p = *head;                                                                //p指向头结点,从头结点开始找
        while(p!=NULL && strcmp(p->name,name))                        //查找姓名为name的候选人,(必须用strcmp,因为是字符串数组)
                p = p->next;                                                //指针指向下一结点
               
      if(NULL == p)
        {
                if(add(head,name ,num))                                                //调用增加链表长度函数
            {
                printf("Error: In find ,after add!\n");
                return -1;
                    }
    }
//    if(!strcmp(p->name,name))                                                // 如果找到该候选人的名字
    else
    {
              if(-1!=num)
             {
                    p->num+=num;                                                //则增加相应的票数
                    return 1;
        }
               
              else                                     //调用删除函数
                    *head = dele(*head,p);                                                                                       
        }
      
    return 0;
}

void main()
{
        node *head=NULL, *p=NULL, *q=NULL;
        int i = 0, j = 0;
        
        while(1)
        {
                printf("输入1投票,输入0结束投票\n");
                scanf("%d",&j);
                if(j==1)
                {
                        q=(node *)malloc(sizeof(node));                                //分配一个新结点空间
                        printf("请输入的候选人的名字和票数:\n");
                        scanf("%s %d",q->name,&q->num);
                        q->next = NULL;                                                                //新结点指针域指向空
                        
                        if(NULL==head)
                        {
                                head = q;
                         }
                        else
                        {
                               i = find(&head, q->name,q->num);
                               if(i == 1)
                                       free(q);
                        }
                }
                else
                        break;
        }
               
        printf("最后结果为:\n");
        for(p=head;p;p=p->next)
                printf("%s %d\n",p->name,p->num);
        while(head)
        {
                p=head;
                head = head->next;
                free(p);
        }
        
}



[ 本帖最后由 erikyo 于 2010-8-3 14:44 编辑 ]
2010-08-03 14:43
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
strcpy经常会出问题,我也曾出过,只是到现在还不知道怎么解决

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2010-08-03 14:46
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
建议不要在main函数里malloc,直接在add函数里加个判断head指针是否为空就可以。
这样更加清晰,内存的释放也很清楚,你的程序里其实有内存为释放的情况。
main函数中除了head指针的指向那个节点有用,其余的生成节点内存都未释放,
建议用变量代替。
收到的鲜花
  • yourcandy2010-08-03 16:37 送鲜花  1朵   附言:好文章
2010-08-03 14:48
yourcandy
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-6-1
收藏
得分:0 
回复 4楼 erikyo
楼上犀利,小弟刚学c语言,能告诉我qq号吗?让我多膜拜膜拜
2010-08-03 16:33
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:5 
回复 5楼 yourcandy
305765867,不过白天基本不上q的。
论坛还是来的蛮勤快的,所以你在这个论坛发帖,反而更加容易及时解决问题。
2010-08-03 16:50
yourcandy
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-6-1
收藏
得分:0 
回复 6楼 erikyo
在查找函数中为什么head要定义成**head啊
2010-08-03 20:27
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 7楼 yourcandy
这个是因为你传入的head指针,在find函数内部是以副本的形式存在的。
如果你对这个head指针内容进行修改,比如delete掉head,那么其实没有改变main函数中原始的head的内容,
所以用二级指针来达到修改的目的。
当然你也可以用返回head指针的方式来实现这个功能,相应的,你find函数的返回类型要修改。
2010-08-04 12:09
快速回复:小弟是菜鸟,高手帮帮忙,c语言编程遇到问题
数据加载中...
 
   



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

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