标题:哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功,但 ...
只看楼主
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
结帖率:100%
已结贴  问题点数:20 回复次数:14 
哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功,但查询的时候查不到!
Add_Single(node head)
{
 node p, p1;                       // 结构体中用 typedef定义的一个  node型 指针
 
 p1 = head->next;
 while (p1 != NULL)
 {
  p1 = p1->next;
 }


 p = (node)malloc(sizeof(Node));
 if (p == NULL)
 {
   printf("内存分配失败!");
   exit(1);
 }
 else
 {
  printf("输入增加的学生姓名:");
  scanf("%s", p->name);
  printf("输入增加的学生分数:");
  scanf("%d", &p->mark);

  p1 = p;                                   //记录添加在链表最后,让p1 指向 p,最后p->next置空
  p->next = NULL;
  
 }
  printf("增加记录成功!");
  
}


[ 本帖最后由 missu_1314 于 2012-2-14 00:10 编辑 ]
搜索更多相关主题的帖子: next 记录 结构体 
2012-02-14 00:00
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
得分:0 
scanf (”%d”,&p—〉mark);改为scanf(”%d“,p->mark);p已是指针了,其余的没看,用的是手机。
2012-02-14 08:49
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:20 
因为head只是形参,当这个函数调用完之后,所添加的节点又会消亡。
有两种方法,一是将head指针设为全局变量,二是用指向指针的指针,即用node *head作为参数

我的地盘
2012-02-14 09:40
snakelazixp
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2012-2-13
得分:0 
同意二楼的。。。。。。。。。。。。
2012-02-14 13:25
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
以下是引用回首依依在2012-2-14 08:49:50的发言:

scanf (”%d”,&p—〉mark);改为scanf(”%d“,p->mark);p已是指针了,其余的没看,用的是手机。
你好, 这里用 scanf("%d", &p->mark); 是因为 mark代表的是分数,定义的是 个整形数据,这里我觉得是没问题的。   
 我的理由是:
p->mark 表示的是  mark 这个数, 那么 scanf 接收的是地址, 所以在  前面加  '&'. 而上面的  
scanf("%s", p->name);  name 是一个 字符数组, name 数组名就是这个数组的首地址, 所以不用加'&'

[ 本帖最后由 missu_1314 于 2012-2-14 15:09 编辑 ]
2012-02-14 13:25
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
以下是引用hnuhsg1226在2012-2-14 09:40:37的发言:

因为head只是形参,当这个函数调用完之后,所添加的节点又会消亡。
有两种方法,一是将head指针设为全局变量,二是用指向指针的指针,即用node *head作为参数
   我试试
2012-02-14 14:28
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:0 
回复 6楼 missu_1314
建议网上百度下函数传值和传址的区别

我的地盘
2012-02-14 14:35
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
回复 7楼 hnuhsg1226
刚思考了下,你说的 函数调用完后 节点会消失的问题, 那我想, 在 Add_Single 函数内部 再次调用 search_All 函数,查看所有学生记录,这个时候函数还没有调用结束,应该是可以查到的吧?    然后我就试了试,调试结果是: 在Add_Single 内部调用 查找所有学生记录的时候, 刚增加的记录还是找不到! 所以我又有点想不通了!!     能不能解释下?   或者 帮我修改一下我的 增加单个记录的代码 我分析分析  看跟我的有什么不同?   

2012-02-14 15:07
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:0 
不如贴上你的源码,我帮你修改下

我的地盘
2012-02-14 15:11
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>



///////////////////////////


typedef struct Student
{
    char name[20];
    int  mark;

    struct Student *next;
} Node, *node;



////////////////////////





///////////////////////////

void Search_All(node head)
{
 node p;

 p = head->next;

 while (p != NULL)
 {
  printf("姓名:%s\t\t", p->name);
  printf("分数:%d\n", p->mark);
  p = p->next;
 }

}


///////////////////////////////////



Search_Single(char name[20], node head)
{
 node p;
 p = head->next;
 
 while (p != NULL)
 {
      if (strcmp(name,p->name) == 0)
     {
       printf("该学生的分数为:%d",  p->mark);
       return 0;
     }
     else
         p = p->next;
 }
    printf ("没有找到该学生!");
    return 0;
}

/////////////////////////////////////////


Del_Single(char name[20], node head)
{
 node p, q;
 p = head;

 while (p->next != NULL)
 {
  if (strcmp(name, p->next->name) == 0)
  {
    q = p->next;
    p->next = p->next->next;
    free(q);
    printf("该学生记录已删除");
    return 0;
  }
  else
      p = p->next;
 }
  printf("没有找到该学生记录!");
  return -1;
}


///////////////////////////////////////////

Add_Single(node head)
{
 node p, p1;
 
 p1 = head->next;
 while (p1 != NULL)
 {
  p1 = p1->next;
 }


 p = (node)malloc(sizeof(Node));
 if (p == NULL)
 {
   printf("内存分配失败!");
   exit(1);
 }
 else
 {
  printf("输入增加的学生姓名:");
  scanf("%s", p->name);
  printf("输入增加的学生分数:");
  scanf("%d", &p->mark);

  p1 = p;
  p->next = NULL;
  
 }
  printf("增加记录成功!");
  printf("查询新纪录:\n");

  getch();

  Search_All(head);

  getch();
  
}


///////////////////////////////////////////////

void main(void)
{
    int  num, i;
    node head, p ,p1;
    char name[20];
    char key;
   
   
    head = (node)malloc(sizeof(Node));
        if (head == NULL)
        {
            printf("内存分配失败!");
            exit(1);
        }
        else
            head->next = NULL;
        
        printf("请输入学生人数:\n");
        scanf("%d", &num);
        
        printf("请输入学生的信息:\n");
            
        for (i=0;  i < num; i++)
        {
          p = (node)malloc(sizeof(Node));
          if ( p == NULL)
          {
              printf("分配内存失败!");
              exit(1);
          }
          else
          {
            printf("姓名:");
            scanf("%s", p->name);
            printf("分数:");
            scanf("%d", &p->mark);
            printf("\n");
          }

          if (head->next == NULL)
          {
            head->next = p;
            p1 = p;
          }
          else
          {
            p1->next = p;
            p1 = p;
          }
        }
        
       p1->next = NULL;         //将最后的指针域置空 很重要   
       p = head->next;
       while ( p!= NULL)
       {
         printf("姓名:%s\t", p->name);
         printf("分数:%d\n", p->mark);
         p = p->next;
       }

Loop:
       system("cls");
       printf("1.查询所有学生成绩\n");
       printf("2.查询一个学生成绩\n");
       printf("3.删除一个学生记录\n");
       printf("4.增加一个学生记录\n");
       printf("5.退出");

       key = getch();
       if ( key == '1')
       {
         system("cls");
         Search_All(head);
         getch();
         goto Loop;
      
       }
       else if ( key == '2')
       {
            system("cls");
            printf("输入要查询的学生姓名");
            scanf("%s", name);
            Search_Single(name, head);
            getch();
            goto Loop;
       }
       else if ( key == '3' )
       {
         system("cls");
         printf("请输入要删除记录的学生姓名");
         scanf("%s", name);
         Del_Single(name, head);
         getch();
         goto Loop;
       }
       else if (key == '4')
       {
         system("cls");
         Add_Single(head);
         getch();
         goto Loop;
       }
       else if (key == '5')
       {
          exit(0);
       }
      
}
2012-02-14 15:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360862-1-1.html




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

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