| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
雷速体育发帖软件开发QQ118000023C语言培训|一对一辅导|零基础学编程LightningChart 快速先进的.Net图表控件
共有 270 人关注过本帖
标题:通讯管理系统,大一课设,链表问题,查询时 不能完整输出要查询内容
只看楼主 收藏
恪律
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-1-8
结帖率:0
  已结贴   问题点数:2  回复次数:4   
通讯管理系统,大一课设,链表问题,查询时 不能完整输出要查询内容
#include<stdio.h>
#include<stdlib.h>
#include "conio.h"
typedef struct student
{
    char sname[15];
    char ssex[20];
    long ntell;
    char sadress[20];
    struct student *pnext;
}stu;
stu *phead=NULL;
stu *input()
{     
     while(1)
     {
         char chose;
        stu *pnew,*p2=phead ; //当前节点
        pnew=(stu *)malloc(sizeof(stu));
        pnew->pnext=NULL;
        if(pnew==NULL)
        {
            printf("内存分配失败!\n");
            exit(1);
        }
        printf("请输入信息: 姓名 性别 电话 地址\n");
        scanf("%s %s %ld %s",pnew->sname,pnew->ssex,&pnew->ntell,pnew->sadress);
        p2->pnext=pnew;
        p2=p2->pnext;
        printf("输入成功,退出请按Y,按任意键继续输入\n");
       chose=getche();
         if(chose=='Y'||chose=='y')
          break;
     }
     return phead;
 }
void print(stu *pp)   
{
    pp=pp->pnext;
    while(pp!=NULL)
    {
        printf("姓名%s 性别%s 电话%ld 地址%s",pp->sname,pp->ssex,pp->ntell,pp->sadress);
        pp=pp->pnext;
    }
    printf("\n按任意键继续!");
    getche();
}
int main()
{    int a;
     phead=(stu *)malloc(sizeof(stu));
     phead->pnext=NULL;
   while(1)
    {
     printf("====================欢迎来到菠菜叶通讯录管理系统v1.0========================\n");
     printf("  ================功能选择=================\n");
        printf("\t\t1.电话信息录入\n");
        printf("\t\t2.电话信息查询\n");
        printf("\t\t3.电话信息删除\n");
        printf("\t\t4.电话信息修改\n");
        printf("\t\t0.退出系统\n");
        scanf("%d",&a);
        switch(a)
        {
        case 1 :input();//录入信息
            break;
        case 2: print(phead);//查询信息
            break;
        case 3:
            break;
        case 4:
            break;
        case 0:
            break;
        }
    }
return 0;
}






2018-01-10 12:57
爱编程的书生
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:23
注 册:2018-1-10
  得分:1 
错误不在你的print函数,在于你的input函数

[此贴子已经被作者于2018-1-10 17:49编辑过]

2018-01-10 17:48
Jonny0201
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:283
专家分:1336
注 册:2016-11-7
  得分:1 
你的应该是带头结点的非循环单链表
问题应该出在 input 函数里的 p2 = p2->next
p2 本来指向 head,但是你这句把 head 给改了
把 p2 的宣告放到循环外面就对了
stu *input()
{     
    stu *p2=phead ; //当前节
     while(1)
     {
         char chose;
        stu *pnew;
        pnew=(stu *)malloc(sizeof(stu));
        pnew->pnext=NULL;
        if(pnew==NULL)
        {
            printf("内存分配失败!\n");
            exit(1);
        }
        printf("请输入信息: 姓名 性别 电话 地址\n");
        scanf("%s %s %ld %s",pnew->sname,pnew->ssex,&pnew->ntell,pnew->sadress);
        p2->pnext=pnew;
        p2=p2->pnext;
        printf("输入成功,退出请按Y,按任意键继续输入\n");
       chose=getchar();
         if(chose=='Y'||chose=='y')
          break;
     }
     return phead;
 }
2018-01-10 17:52
爱编程的书生
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:23
注 册:2018-1-10
  得分:0 
尾指针要设置好,你这里的p2要设置成全局变量,并在首指针分配空间后指向首指针;
因为如果放在函数内部,下一次你再进入该函数录入后,又从首指针开始向后录入,你上次进入该函数录入的数据就不见了
尾指针要设为全局变量

尾插法:
程序代码:

stu *ptail=NULL;//定义尾指针
stu *input()
{     
     while(1)
     {
        char chose;
        stu *pnew; //当前节点
        pnew=(stu *)malloc(sizeof(stu));
        pnew->pnext=NULL;
        if(pnew==NULL)
        {
            printf("内存分配失败!\n");
            exit(1);
        }
        printf("请输入信息: 姓名 性别 电话 地址\n");
        scanf("%s %s %ld %s",pnew->sname,pnew->ssex,&pnew->ntell,pnew->sadress);

        ptail->pnext=pnew; //尾指针插入
        ptail=pnew;

        printf("输入成功,退出请按Y,按任意键继续输入\n");
        chose=getche();
         if(chose=='Y'||chose=='y')
          break;
     }
     return phead;
 }

main函数中要初始化尾指针
程序代码:
int main()
{    int a;
     phead=(stu *)malloc(sizeof(stu));
     phead->pnext=NULL;
   
     ptail=phead;   //尾指针指向头指针
   while(1)
    {
     printf("====================欢迎来到菠菜叶通讯录管理系统v1.0========================\n");
     printf("  ================功能选择=================\n");
        printf("\t\t1.电话信息录入\n");
        printf("\t\t2.电话信息查询\n");
        printf("\t\t3.电话信息删除\n");
        printf("\t\t4.电话信息修改\n");
        printf("\t\t0.退出系统\n");
        fflush(stdin);     //清空缓冲区
        scanf("%d",&a);
        switch(a)
        {
        case 1 :input();//录入信息
            break;
        case 2: print(phead);//查询信息
            break;
        case 3:
            break;
        case 4:
            break;
        case 0:
            break;
        }
    }
return 0;
}

除此之外,给个建议最好在scanf等输入函数前,清空缓冲区fflush(stdin);

[此贴子已经被作者于2018-1-10 19:16编辑过]

2018-01-10 19:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:145
帖 子:5929
专家分:25869
注 册:2014-5-20
  得分:1 
#include <stdio.h>
#include <stdlib.h>
#include "conio.h"

typedef struct student
{
    char sname[15];
    char ssex[20];
    long ntell;
    char sadress[20];
    struct student *pnext;
} stu;

stu *input(stu *head)
{
    char chose;
    stu *pnew;
    while(1)
    {
        pnew = (stu *)malloc(sizeof(stu));
        if (pnew == NULL)
        {
            printf("内存分配失败!\n");
            exit(1);
        }
        pnew->pnext = head;
        head = pnew;
        printf("请输入信息: 姓名 性别 电话 地址\n");
        scanf("%s%s%ld%s",pnew->sname,pnew->ssex,&pnew->ntell,pnew->sadress);
        while (getchar()!='\n');
        printf("输入成功,退出请按Y,按任意键继续输入\n");
        chose = getche();
        if (chose=='Y'||chose=='y')
            break;
    }
    return head;
}

void print(stu *pp)
{
    for (; pp; pp=pp->pnext)
        printf("姓名%s 性别%s 电话%ld 地址%s\n",pp->sname,pp->ssex,pp->ntell,pp->sadress);
}

int main()
{
    stu *phead=NULL;
    int a;
    do
    {
        system("cls");
        printf("====================欢迎来到菠菜叶通讯录管理系统v1.0========================\n");
        printf("  ================功能选择=================\n");
        printf("\t\t1.电话信息录入\n");
        printf("\t\t2.电话信息查询\n");
        printf("\t\t3.电话信息删除\n");
        printf("\t\t4.电话信息修改\n");
        printf("\t\t0.退出系统\n");
        scanf("%d",&a);
        while (getchar()!='\n');
        switch(a)
        {
            case 1 :
                phead = input(phead);//录入信息
                break;
            case 2:
                print(phead);//查询信息
                break;
            case 3:
                break;
            case 4:
                break;
            case 0:
                break;
        }
        system("pause");
    }
    while (a!=0);
     return 0;
}

[此贴子已经被作者于2018-1-11 06:18编辑过]

2018-01-11 06:17







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

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