wowchinamalin
2014-09-28 01:07
采纳率: 0%
浏览 2.0k

链表删除头结点出现头结点输出异常

/*
内容:链表的基本操作
时间:2014.9.19*/
#include
#include
#include
#define SIZE 10
struct student
{
int num;//链表元素-学号
char name[SIZE];//链表元素-姓名
struct student *next;//链表指针域
};
struct student * creat()
{
int i=0,number;//判断是否为头结点
struct student * head,*p,*q;
printf("请输入学号,按“0”退出\n");
scanf("%d",&number);
while(number!=0)
{
i=i+1;
p = (struct student *)malloc(sizeof(struct student));//动态开辟链表节点
if(p == NULL)//不能正常分配内存
exit(1);
p->num=number;
printf("请输入姓名\n");
scanf("%s",&p->name);
if(i==1)
{
head=p;
}
else
{
q->next=p;
}
q=p;
p->next=NULL;
printf("请输入学号,按“0”退出\n");
scanf("%d",&number);
}
return head;
}
struct student * shuchu(struct student * head)//链表输出函数
{
struct student * p;
p=head;
while(p!=NULL)
{
printf("num:%d name:%s\n",p->num,p->name);
p=p->next;

}

}
struct student *shanchu(struct student *head)//删除节点函数
{
struct student * p, * q , *k;
int a;
p=head;
q=head;
printf("请输入你要删除的学生学号:\n");
scanf("%d",&a);
if(a==p->num&&p!=NULL)
{
k=head;//把头结点给K
head=head->next;//头结点后移一位
printf("head->num=%d\n",head->num);//输出头结点的num用以测试
free(k);//释放k结点
printf("111111111111111\n");
}
else
{

    while(q!=NULL)
    {
        if(q->num!=a)//如果输入学号与节点学号不同则判断下一个
        {
            p=q;
            q=q->next;
        }
        else//如果相同则删除
        {
            k=q;
            q=q->next;
            p->next=q;
            free(k);
        }
    }printf("22222222222222\n");
}
return head;
};

int main()
{
struct student * p;
p=creat();printf("22222222222222\n");
shuchu(p);
//shuchu(p);
p=shanchu(p);
shuchu(p);
}
这段代码删除头结点时头结点后移了,但是输出的时候为什么出现错误?是不是指针的问题?找不出来了,求助

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • u013648963 2014-09-28 12:48

    头结点删除了,肯定输出是下一个了。
    另外请用delete和print命名函数名。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题