严凯 发表于 2021-3-29 09:31:52

链表

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
      char name;
      char number;
      int score;
      struct student *next;
}STU;
int lenth(STU *head)
{
      int k=0;
      STU *stu1;
      stu1=head;
      while(stu1!=NULL)
      {
                stu1=stu1->next;
                k++;
      }
      return k;
}
void insert(STU *head)
{
      STU *stu;
      stu=head;
      int i,j=0;
      j=lenth(head);
      printf("%d",j);
      printf("请问你要在哪里插入?");
      scanf("%d",&i);
      

}
void seek(STU *head)
{
      char number1;
      printf("请输入你要查找的学号:");
      scanf("%s",number1);
      STU *stu;;
      stu=head;
      while(stu!=NULL)
      {
                if(strcmp(stu->number,number1)!=0)
                {
                        stu=stu->next;
                }
                else
                {
                        printf("你要查找的人的姓名是%s\n",stu->name);
                        printf("这个人的学号是%s\n",stu->number);
                        printf("这个人的成绩是%d\n",stu->score);
                        break;
                }
      }
}
void getInput(STU *stu)
{
      printf("请输入姓名");
      scanf("%s",stu->name);
      printf("请输入学号");
      scanf("%s",stu->number);
      printf("请输入分数");
      scanf("%d",&stu->score);
}
void add(STU **head)
{
      STU *stu,*temp;
      stu=(STU *)(malloc(sizeof(STU)));
      if(stu==NULL)
      {
                printf("失败!");
                exit(1);
      }
      getInput(stu);
      if(*head!=NULL)
      {
                temp=*head;
                *head=stu;
                stu->next=temp;
      }
      else
      {
                *head=stu;
                stu=stu->next;
      }
}
int main()
{
      int i=0;
      STU *head;
      while(i<16)
      {
                printf("*");
                printf("-");
                i++;
      }
      printf("欢迎来到德莱联盟!\n");
      printf("我有以下操作!\n");
      printf("\t输入一个学生的信息(1)\t");
      printf("插入某一学生的信息(2)\n");
      printf("\t删除某一学生的信息(3)\t");
      printf("查找某个学生的信息(按学号)(4)\n");
      printf("\t打印(5)\t");
      printf("退出(6)\n");
      printf("OK!请开始你的表演(我就笑笑不说话了^-^)\n");
      while(i!=6)
      {
                printf("你要进行什么操作?");
                scanf("%d",&i);
      switch(i)
      {
      case 1:add(&head);break;
      case 2:insert(head);break;
      case 4:seek(head);break;
      }
      }
      return 0;
}


//我这个是一个还没完成的链表,我的功能2感觉有问题,就是插入功能,insert函数里面我调用了一个lenth函数求链表长度,但是我下面的printf("%d",j)和printf("你要在哪里插入")和scanf("%d",&i);都没有反应,怎么肥事?//哎,我的妈呀,再发一次,我试了一下,当我已经输入两个学生的信息时,在lenth函数的循环里面打印k,打印出来是1和2,表示循环没有,问题,下面又是一个return k;为什么后面的操作就不行了

yuxijian2020 发表于 2021-3-29 10:27:39

你还没发现你的问题嘛
问题的关键在于你lenth方法里循环的判断条件
你在add方法里没有对next指针初始化,就是没有赋值为NULL
所以你lenth方法是死循环

严凯 发表于 2021-3-30 19:15:47

yuxijian2020 发表于 2021-3-29 10:27
你还没发现你的问题嘛
问题的关键在于你lenth方法里循环的判断条件
你在add方法里没有对next指针初始化 ...

那这个怎么改???

yuxijian2020 发表于 2021-3-30 19:35:27

2个地方都行
//1.add方法中添加
getInput(stu); //add方法里这句后面加上
stu->next = NULL;
//2.getInput方法最后一行加上
stu->next = NULL;

yuxijian2020 发表于 2021-3-30 19:37:12

本帖最后由 yuxijian2020 于 2021-3-30 19:38 编辑

又或者
//还是add方法中
stu=(STU *)(malloc(sizeof(STU)));//这句后面加上
memset(stu, 0, sizeof(STU))

总之就是对新建的对象初始化,你每次只是输入了STU中保存数据的值,一直没有对next指针做初始化操作
页: [1]
查看完整版本: 链表