标题:哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功,但 ...
取消只看楼主
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
结帖率:100%
已结贴  问题点数:20 回复次数:6 
哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功,但查询的时候查不到!
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
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
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
回复 7楼 hnuhsg1226
刚思考了下,你说的 函数调用完后 节点会消失的问题, 那我想, 在 Add_Single 函数内部 再次调用 search_All 函数,查看所有学生记录,这个时候函数还没有调用结束,应该是可以查到的吧?    然后我就试了试,调试结果是: 在Add_Single 内部调用 查找所有学生记录的时候, 刚增加的记录还是找不到! 所以我又有点想不通了!!     能不能解释下?   或者 帮我修改一下我的 增加单个记录的代码 我分析分析  看跟我的有什么不同?   

2012-02-14 15:07
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
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
得分:0 
麻烦了!!!  没有写什么注释  , 这个毛病要改改! 呵呵  , 还好代码比较简单

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

不好意思,由于你的代码确实写得不规范,阅读性差,改起来需要多点时间,我就用自己的风格给你写了个,请见谅。#include
#include
#include
#include
/*
建的是带头结点为空的单链表。
下面是我提的几点建议:
当函数有返回值的时候,你就没添加函数返回值类型声明
写这种模块式的程序,记得要简化函数的功能,尽可能的让某个函数完成某项单一的功能,这样容易发现问题,也容易解决。
先从框架做起,然后再逐步细化下去。
你所提到的问题还是在函数参数传值与传址的问题,这在每本讲c的书上都会在函数那章有说明的。
有时候你都不确定你用的指针指向了哪里,建议多在纸上画画。
某些函数还可以进一步简化,增加联系,可以尝试去修改。
*/
typedef struct Student
{
    char name[20];
    char  mark[5];        //输入的习惯性策略都是字符串
    struct Student *next;
} Node, *node;
node LHead;    //头结点
 
void Search_All(void)  //链表整体输出
{
    node p;
    p = LHead -> next;
    while(p != NULL)
    {
        printf("姓名:%s\t分数:%s\n", p->name, p->mark);
        p = p->next;
    }
}
void Search_Single(void)  //单一元素查询
{
    char name[20];
    node p;
    p = LHead -> next;
    printf("请输入你要查询学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name,p->name) == 0)
        {
            printf("该学生的分数为:%s\n",  p->mark);
            break;   
        }
        p = p->next;
    }
    if (NULL == p)
        printf ("没有找到该学生!\n");
}
void Del_Single(void)  //删除单一元素
{
    node p, q, head;
    head = p = LHead->next;
    char name[20];
    printf("请输入你要删除学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name, p->name) == 0)
        {
            //删除节点可以分2种情况,一是头结点,二是其他结点
            if(head == p)
            {
                LHead->next = p->next;
            }
            else
            {
                q->next = p->next;
            }
            free(p);
            printf("该学生记录已删除\n");
            break;
        }
        q = p;
        p = p->next;
    }
    if (p == NULL)
        printf ("没有找到该学生!\n");
}
void Add_Single(void)  //增加新的学生信息,根据姓名排序
{
    node p, q, old, head;
    head = q = LHead -> next;
    p = (node)malloc(sizeof(Node));
    if (p == NULL)
    {
        printf("内存分配失败!");
        exit(1);
    }
    printf("输入增加的学生姓名:");
    gets(p->name);
    printf("输入增加的学生分数:");
    gets(p->mark);
    //插入信息也有四种情况,一种是空表情况,二种是插入表头,三种是插入表中,四是插入表尾
    if (NULL == q)
    {
        LHead -> next = p;
        p -> next = NULL;
    }
    else
    {
        while(q != NULL)
        {
            if (strcmp(p->name, q->name) == 0)
            {
                //此时所输账号相同
                printf("此学生姓名早已存在。\n");
                break;
            }
            else if(strcmp(p->name, q->name) < 0)
            {
                if(head == q)
                {
                    //放表头
                    LHead -> next = p;
                    p ->next = q;
                }
                else
                {
                    //放表中
                    old->next = p;
                    p->next = q;
                }
                break;
            }
            old = q;
            q = q->next;
        }
        if(q == NULL)
        {
            //放表尾
            old -> next = p;
            p -> next = NULL;
        }
    }
}
int menu(void)     //显示主菜单函数
{
    char s[20];
    int c;
    system("cls");
    printf("\t\t*****************学生信息管理系统*****************\n");
    printf("\t\t*\t\t|1.学生信息录入                   *\n");
    printf("\t\t*\t\t|2.学生信息浏览                   *\n");
    printf("\t\t*\t\t|3.学生信息查询                   *\n");
    printf("\t\t*\t\t|4.学生信息删除                   *\n");
    printf("\t\t*\t\t|5.退出系统                       *\n");
    printf("\t\t*****************学生信息管理系统*****************\n\n\n");
    printf("\t\t请输入以上序号进行选择:\n");
    do{
          gets(s);
          c = atoi(s);
    }while(c<0||c>8);
    return c;
}
int main(void)
{
    LHead = (node)malloc(sizeof(Node));
    LHead ->next = NULL;
    while(1)
    {
        switch(menu())
        {
            case 1:Add_Single();system("pause");//录入
                   break;
            case 2:Search_All();system("pause");//浏览
                   break;
            case 3:Search_Single();system("pause");//查询
                   break;
            case 4:Del_Single();system("pause");//删除
                   break;
            case 5:exit(0);
        }//end switch
    }//end while
    system("pause");
    return 0;
}
你调试了吗?  这代码我放我的机子上调试  提示错误!!  我发现不了问题!  


2012-02-14 22:56



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




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

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