NaterStrat 发表于 2019-7-21 16:38:36

看了最初的c的视频,然后在链表的删除成员中程序无法实现,求指点

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Student)//定义LEN的数据类型

struct Student
{
    int num;
    float score;
    struct Student *next;
};
int n;//定义全局变量,计算链表的个数

struct Student *creat()//建立一个建立动态链表的函数
{
    struct Student *head;   //定义头指针
    struct Student *p1,*p2;
    n=0;
    p1=p2=(struct Student *)malloc(LEN); //开辟一个新单元
    scanf("%d",&p1->num);
    scanf("%f",&p1->score);
    head=NULL;//把头文件清零
    while(p1->num!=0)//只要数字不是0,就继续制作链表
    {
      n++;
      if(n==1)
      {
            head=p1;//把头指针定义到链表第一个元素
      }
      else
      {
            p2->next=p1;//把p2的next指针指向p1的第一个成员
      }
      p2=p1;
      p1=(struct Student*)malloc(LEN);//建立动态链表
      scanf("%d",&p1->num);
      scanf("%f",&p1->score);
    }//只要学号不是0,就能一直制作,一旦到0,就跳出循环
    p2->next=NULL;//只要p1指向0,那么p2就一直指向p1之前的
    return(head);//返回头指针
}
void print(struct Student *head)//输出链表的函数
{
    struct Student *p;
    printf("\nNow,These %d record are:\n",n);
    p=head;
    if(head!=NULL) //只要头文件不是0,就一直打印
    {
      do
      {
            printf("%ld,%5.1f\n",p->num,p->score);
            p=p->next;//让p指向下一个节点
      }
      while(p!=NULL);//只要p不是指向0就继续打印下一个成员
    }
}
struct Student *shan(struct Student *head,int a)
{
    struct Student *p1,*p2;
    if(head==NULL)
    {
      printf("\nTHIS LIST IS NULL");
      goto END;
    }
    p1=head;
    while((*p1).num!=a&&(*p1).num!=NULL)
      {
            p2=p1;//p2向后移动一个位置
            p1=p1->next; //P1向后移一个位置
      }
    if(p1->num==a)//p1是要删除的结点
    {
      if(p1==head)//如果p1是头结点
      {
            head=p1->next;//删除头结点
      }
      else
      {
            p2->next=p1->next; //删除当前结点
      }
    }
    else
    {
      printf("can't find the number");
    }
END:
    return head;
}
int main()
{
    struct Student *stu,*p;
    int c;
    stu=creat();//调用建表函数,返回值赋值给stu
    p=stu;
    print(p);//调用打印函数
    printf("please scanf a number");
    scanf("%d",&c);
    print(shan(p,c));
    printf("\n\n");
    system("pause");
}

程序在第一次打印链表之后,输入C之后后续删除链表步骤无法进行,求指导

bin554385863 发表于 2019-7-21 17:00:46

你这是照着书上的代码敲的代码吧,你真正理解它了么,它是怎么实现链表的?
你要是真正理解了它,并且能自己写出链表,后面的链表的输出,插入,删除都不是问题

NaterStrat 发表于 2019-7-21 18:34:36

bin554385863 发表于 2019-7-21 17:00
你这是照着书上的代码敲的代码吧,你真正理解它了么,它是怎么实现链表的?
你要是真正理解了它,并且能自己写 ...

书上没有这个,是按照视频的思路自己敲的,然后根据源代码修改了一点细节,如何实现的我也都明白,但是敲完之后看下来,不知道哪里不对

bin554385863 发表于 2019-7-21 18:43:23

NaterStrat 发表于 2019-7-21 18:34
书上没有这个,是按照视频的思路自己敲的,然后根据源代码修改了一点细节,如何实现的我也都明白,但是 ...

兄弟你要有自己的思路,而不是根据别人的思路,
视频和书本上的代码只是给你你一个想法,当你能独立写出一个链表的时候,其他的链表操作都不是问题!

不怕你笑话,我花了半个月时间,才彻底理解了链表并且能独立写出自己的链表
#include <stdio.h>
#include <stdlib.h>
/*创建自引用结构体 */
typedef struct _node
{
    int value;
    struct _node *next;
} node;
#define MALLOC (node *)malloc(sizeof(node))
/*链表创建函数 */
node *CreatNode(void)
{
    /*定义头结点 */
    node *p0 = NULL;
    /*定义临时头结点 */
    node *p1 = NULL;
    /*定义尾结点 */
    node *p2 = NULL;
    /*定义待插入节点 */
    node *p3 = NULL;
    /*分配第一个节点空间 */
    p2 = MALLOC;
    /*判断是否分配节点空间成功 */
    if (p2 != NULL)
    {
      /*临时头结点指向第一个节点 */
      p1 = p2;
      /*临时头结点数据成员为空 */
      p1->value = NULL;
      /*循环创建链表 */
      printf("--------输入链表数据--------\n");
      while (1)
      {
            /*开辟新节点空间 */
            p3 = MALLOC;
            /*判断新节点是否开辟成功 */
            if (p3 != NULL)
            {
                /*继续输入新节点的数据 */
                scanf("%d", &p3->value);
                /*-1为结束符 */
                if (p3->value == -1)
                {
                  break;
                }

                /*尾结点指针成员指向新开辟的节点 */
                p2->next = p3;
                /*使用递归的方法将所有的节点串联起来 */
                p2 = p2->next;
            }
      }
      /*将尾结点置空 */
      p2->next = NULL;
    }
    /*头结点指向第一个有效节点 */
    p0 = p1->next;
    /*释放临时头结点的内存空间 */
    free(p1);
    return p0;
}
/*链表输出函数 */
void PrintNode(node *t_node)
{
    node *t = t_node;
      while (t != NULL)
    {
      printf("%d ", t->value);
      t = t->next;
    }
}
int main(int argc, char const *argv[])
{
    node *linklist = NULL;
    /*调用创建链表函数 */
    linklist = CreatNode();
    /*调用链表输出函数 */
    PrintNode(linklist);
    return 0;
}

这是我自己独立写出的代码,上面有很详细的注释,希望能对你有用

Neverturnback 发表于 2019-7-31 17:17:19

本帖最后由 Neverturnback 于 2019-7-31 17:26 编辑

程序没问题!
运行试过的代码的功能都可以正常执行

你最后是不是只输入了一个0
scanf("%d",&p1->num);
    scanf("%f",&p1->score);这边要输入两个数才能继续往下运行,你能只输入了一个0所以没有继续执行删除程序


友情提醒:动态分配的空间要主动释放掉!!!!malloc分配了空间记得最后不用的时候释放掉!!!!!
页: [1]
查看完整版本: 看了最初的c的视频,然后在链表的删除成员中程序无法实现,求指点