看了最初的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
你这是照着书上的代码敲的代码吧,你真正理解它了么,它是怎么实现链表的?
你要是真正理解了它,并且能自己写 ...
书上没有这个,是按照视频的思路自己敲的,然后根据源代码修改了一点细节,如何实现的我也都明白,但是敲完之后看下来,不知道哪里不对 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:26 编辑
程序没问题!
运行试过的代码的功能都可以正常执行
你最后是不是只输入了一个0
scanf("%d",&p1->num);
scanf("%f",&p1->score);这边要输入两个数才能继续往下运行,你能只输入了一个0所以没有继续执行删除程序
友情提醒:动态分配的空间要主动释放掉!!!!malloc分配了空间记得最后不用的时候释放掉!!!!!
页:
[1]