小弟是菜鸟,高手帮帮忙,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还是没考配进去,求高手帮忙