| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 342 人关注过本帖, 1 人收藏
标题:链表删除问题
只看楼主 加入收藏
鱼游海底
Rank: 1
来 自:中国
等 级:新手上路
帖 子:132
专家分:2
注 册:2015-4-16
结帖率:57.14%
收藏(1)
已结贴  问题点数:5 回复次数:3 
链表删除问题
#include"stdio.h"
#include"stdlib.h"
#define LEN sizeof(struct Student)
struct Student
{
    long num;
    char name[20];
    char sex[5];
    int old;
    struct Student *next;
};
int n=0;
/*建立链表(不止一种方式)*/
struct Student *creat(void)
{
    struct Student *head,*p1,*p2;
    p1=p2=(struct Student *)malloc(LEN);
    printf("输入第%d学生的信息(学号(学号为零就结束),姓名,性别(man or woman),年龄):\n",n+1);
    scanf("%ld,%s,%s,%d",&p1->num,p1->name,p1->sex,&p1->old);
    head=NULL;
    while(p1->num!=0)
    {
        n++;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=malloc(LEN);
        printf("输入第%d学生的信息(学号,姓名,性别(man or woman),年龄):\n",n+1);
        scanf("%ld,%s,%s,%d",&p1->num,p1->name,p1->sex,&p1->old);
    }
    p2->next=NULL;
    return head;
}
struct Student *del(struct Student *head,int old)
{
    struct Student *p1,*p2;
    int i=1;
    p1=head;
    while(i==1)
    {
        while((old!=p1->old)&&(p1->next!=NULL))
        {
            p2=p1;p1=p1->next;
        }
        if(old==p1->old)
        {
            if(p1==head)head=p1->next;
            else p2->next=p1->next;
            i=1;
        }
        else
        {
            printf("%d not been found!\n",old);i=0;
        }

    }
    return (head);
}
void print(struct Student *head)
{
    struct Student *p;
    printf("\nnow these %d records are:\n",n);
    p=head;
    if(head!=NULL)
    {
        do
        {
            printf("%ld,%s,%s,%d",p->num,p->name,p->sex,p->old);
            p=p->next;
        }while(p!=NULL);
    }
}
int main(void)
{
    int old;
    struct Student *head;
    head=creat();
    printf("输入一个年龄:");
    scanf("%d",&old);
    head=del(head,old);
    print(head);
    return 0;
}
为什么编译没有出现错误,而结果却不是正确的?特别是查找删除和输出新的链表那一块!!
搜索更多相关主题的帖子: include 信息 姓名 
2015-05-28 09:14
情.难言ゝ
Rank: 3Rank: 3
来 自:安徽安庆
等 级:论坛游侠
威 望:1
帖 子:74
专家分:137
注 册:2013-9-8
收藏
得分:5 
scanf("%ld,%s,%s,%d",&p1->num,p1->name,p1->sex,&p1->old) 中比如输入( 1,z,m,12 ),这时p1->name=z,m,12   后面的没有值。。。
del中删除后head为NULL时还会执行,就会有错,应将 while(i==1) 改成while(head!=NULL)

程序代码:
#include "stdio.h"
#include "stdlib.h"

#define LEN sizeof(struct Student)
struct Student 
{
    long num;
    char name[20];
    char sex[5];
    int old;
    struct Student *next;
};
int n=0;
/*建立链表(不止一种方式)*/
struct Student *creat(void)
{
    int num;

    struct Student *head,*p1,*p2;
    p1=p2=(struct Student *)malloc(LEN);
    printf("输入第%d学生的信息(学号(学号为零就结束),姓名,性别(man or woman),年龄):\n",n+1);
    scanf("%ld %s %s %d",&p1->num,p1->name,p1->sex,&p1->old); 
    head=NULL;
    while(p1->num!=0)
    {
        n++;
        if(n==1)  head=p1;
        else   p2->next=p1;
        p2=p1;
       // p1=(struct Student *) malloc(LEN);   // struct Student *

        printf("输入第%d个学生的学号: ",n+1);
        scanf("%ld",&num);
        if(num == 0) 
        {
            break;
        }
        else {
            p1=(struct Student *) malloc(LEN); 
            p1->num=num;
            printf("输入第%d学生的信息(姓名,性别(man or woman),年龄):\n",n+1);
            scanf("%s %s %d",p1->name,p1->sex,&p1->old);
        }    
        // printf("输入第%d学生的信息(学号,姓名,性别(man or woman),年龄):\n",n+1);
        // scanf("%ld,%s,%s,%d",&p1->num,p1->name,p1->sex,&p1->old);  
    }
    p2->next=NULL;
    return head;
}
struct Student *del(struct Student *head,int old)
{
    struct Student *p1,*p2;
    int i=1;
    p1=head;
    while(head!=NULL)
    {
        while((old!=p1->old)&&(p1->next!=NULL))
        {
            p2=p1;p1=p1->next;
        }
        if(old==p1->old)
        {
            printf("\n\t%d\n",p1->old);
            if(p1==head) head=p1->next;
            else p2->next=p1->next;
            // i=1;
            p1=p1->next;  
            n--; // 删除后n要减1
        }
        else
        {
            printf("%d not been found!\n",old); // i=0;
            break;
        }
        
    }
    return (head);
}
void print(struct Student *head)
{
    struct Student *p;
    printf("\nnow these %d records are:\n",n);
    p=head;
    if(head!=NULL)
    {
        do
        {
            printf("%ld  %s  %s  %d\n",p->num,p->name,p->sex,p->old);
            p=p->next;
        }while(p!=NULL);
    }
}
int main(void)
{
    int old;
    struct Student *head;
    head=creat();
    print(head);  //
    printf("输入一个年龄:");
    scanf("%d",&old);
    head=del(head,old);
    print(head);
    return 0;
}

树叶的离去,是风的追求、还是树的不挽留???
2015-05-28 12:47
鱼游海底
Rank: 1
来 自:中国
等 级:新手上路
帖 子:132
专家分:2
注 册:2015-4-16
收藏
得分:0 
回复 2楼 情.难言ゝ
多谢哈!原来在这里,之前没有看到
2015-05-28 20:09
鱼游海底
Rank: 1
来 自:中国
等 级:新手上路
帖 子:132
专家分:2
注 册:2015-4-16
收藏
得分:0 
回复 2楼 情.难言ゝ
问题又来了,为什么我在编译的时候系统会显示   数字没有被找到?   而实际数字已被找到了,而且已经被删除了。。。
2015-05-28 20:28
快速回复:链表删除问题
数据加载中...
 
   



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

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