| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 248 人关注过本帖
标题:求教链表指针问题???
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:1 
求教链表指针问题???
程序是:如果输入的年龄和链表结点的相同,则删除相同年龄的结点。程序现在没有错了。只是中间有个错误误打误撞找到了,但是就是不理解。想大神
们指教。。。。。。。。。。。。。。。。。疑问是删除函数struct student *del(struct student *dhead,int iage)里的一个while()语句。我用》》》
箭头标出来了。求指教。。。。。。


#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#define LEN sizeof(struct student)
#define NULL 0
int n,find;
struct student
{
    int num;
    char name[20];
    char sex;
    int age;
    struct student *next;
}stu;
struct student *create(void)//创建一个动态链表
{
    struct student *p1,*p2,*chead;
    p1 = p2 = (struct student *)malloc(LEN);
    printf("请输入链表数据(各项数据为 0 时输入结束):\n");
    scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
    while(p1->num != 0)
    {
        n = n + 1;
        if(n == 1)chead = p1;
        else p2->next = p1;
        p2 = p1;
        p1 = (struct student *)malloc(LEN);
        scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
    }
    p2->next = NULL;
    return(chead);
}
struct student *del(struct student *dhead,int iage)//删除数据函数
{
    struct student *p1,*p2;
    p1 = p2 = dhead;
    while(p1 != NULL)
    {
》》》》》        while(p1->age != iage)//不相等时  //原来这句是 while(p1->age != iage && p1 != NULL) 为什么加了个  p1 != NULL .程序就错。
        {
            p2 = p1;
            p1 = p1->next;//p1向后移一个结点
        }
        if(p1->age == iage)
        {
            if( dhead == p1)//相等且是头指针的情况
            {
                p1 = p1->next;
                dhead = p2 = p1;
            }
            else//相等但不是头指针。
            {
                p2->next = p1->next;
                p1 = p2->next;
            }
        }
    }
    return(dhead);
}
void print(struct student *fhead)//输出函数
{
    struct student *p;
    p = fhead;
    if(fhead == NULL)printf("空链表!\n");
    else
        do
        {
            printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);
            p = p->next;
        }while(p != NULL);
}
int main(void)
{
    int age;
    char y=1;
    struct student *head,*delf;
    head = create();
    printf("请输入要删除的年龄age :");
    scanf("%d",&age);
    printf("要删除的年龄age = %d\n",age);
    delf = del(head,age);
    printf("删除后的链表数据:\n");
    print(delf);
    free(delf);
    getch();
    return 0;
}

/*
程序运行结果:
--------------------------------------------------------

请输入链表数据(各项数据为 0 时输入结束):
10101 yanga m 18
10102 yangb f 19
10103 yangc m 20
10104 yangd f 18
10105 yange m 19
10106 yangf f 18
0 0 0 0
请输入要删除的年龄age :18
要删除的年龄age = 18
删除后的链表数据:
10102 yangb f 19
10103 yangc m 20
10105 yange m 19

--------------------------------------------------------
*/
搜索更多相关主题的帖子: include 
2015-11-27 19:48
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:20 
》》》》》        while(p1->age != iage)//不相等时  //原来这句是 while(p1->age != iage && p1 != NULL) 为什么加了个  p1 != NULL .程序就错。

原来这句要求&&两边条件同时为真就执行循环,条件判断先左边后右边,如果p1恰好为null,判断左边将出现null->age,会出现SM结果不用俺多说了吧?

我们都在路上。。。。。
2015-11-27 21:08
快速回复:求教链表指针问题???
数据加载中...
 
   



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

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