鱼C论坛

 找回密码
 立即注册
查看: 2054|回复: 4

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

[复制链接]
发表于 2019-7-21 16:38:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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之后后续删除链表步骤无法进行,求指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-21 17:00:46 | 显示全部楼层
你这是照着书上的代码敲的代码吧,你真正理解它了么,它是怎么实现链表的?
你要是真正理解了它,并且能自己写出链表,后面的链表的输出,插入,删除都不是问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


书上没有这个,是按照视频的思路自己敲的,然后根据源代码修改了一点细节,如何实现的我也都明白,但是敲完之后看下来,不知道哪里不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

不怕你笑话,我花了半个月时间,才彻底理解了链表并且能独立写出自己的链表
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*创建自引用结构体 */
  4. typedef struct _node
  5. {
  6.     int value;
  7.     struct _node *next;
  8. } node;
  9. #define MALLOC (node *)malloc(sizeof(node))
  10. /*链表创建函数 */
  11. node *CreatNode(void)
  12. {
  13.     /*定义头结点 */
  14.     node *p0 = NULL;
  15.     /*定义临时头结点 */
  16.     node *p1 = NULL;
  17.     /*定义尾结点 */
  18.     node *p2 = NULL;
  19.     /*定义待插入节点 */
  20.     node *p3 = NULL;
  21.     /*分配第一个节点空间 */
  22.     p2 = MALLOC;
  23.     /*判断是否分配节点空间成功 */
  24.     if (p2 != NULL)
  25.     {
  26.         /*临时头结点指向第一个节点 */
  27.         p1 = p2;
  28.         /*临时头结点数据成员为空 */
  29.         p1->value = NULL;
  30.         /*循环创建链表 */
  31.         printf("--------输入链表数据--------\n");
  32.         while (1)
  33.         {
  34.             /*开辟新节点空间 */
  35.             p3 = MALLOC;
  36.             /*判断新节点是否开辟成功 */
  37.             if (p3 != NULL)
  38.             {
  39.                 /*继续输入新节点的数据 */
  40.                 scanf("%d", &p3->value);
  41.                 /*-1为结束符 */
  42.                 if (p3->value == -1)
  43.                 {
  44.                     break;
  45.                 }

  46.                 /*尾结点指针成员指向新开辟的节点 */
  47.                 p2->next = p3;
  48.                 /*使用递归的方法将所有的节点串联起来 */
  49.                 p2 = p2->next;
  50.             }
  51.         }
  52.         /*将尾结点置空 */
  53.         p2->next = NULL;
  54.     }
  55.     /*头结点指向第一个有效节点 */
  56.     p0 = p1->next;
  57.     /*释放临时头结点的内存空间 */
  58.     free(p1);
  59.     return p0;
  60. }
  61. /*链表输出函数 */
  62. void PrintNode(node *t_node)
  63. {
  64.     node *t = t_node;
  65.         while (t != NULL)
  66.     {
  67.         printf("%d ", t->value);
  68.         t = t->next;
  69.     }
  70. }
  71. int main(int argc, char const *argv[])
  72. {
  73.     node *linklist = NULL;
  74.     /*调用创建链表函数 */
  75.     linklist = CreatNode();
  76.     /*调用链表输出函数 */
  77.     PrintNode(linklist);
  78.     return 0;
  79. }
复制代码


这是我自己独立写出的代码,上面有很详细的注释,希望能对你有用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-31 17:17:19 | 显示全部楼层
本帖最后由 Neverturnback 于 2019-7-31 17:26 编辑

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

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


友情提醒:动态分配的空间要主动释放掉!!!!malloc分配了空间记得最后不用的时候释放掉!!!!!
鱼友程序执行结果图片.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表