struct number *creat(void) { struct number *head,*p1;//定义结构体,head,p1 p1=head=(struct number*)malloc( SIZE * sizeof(struct number)); scanf("%ld",&p1->num); for(;p1->num!=0;L++) { p1++; scanf("%ld",&p1->num); } return(head); }每一段作用
时间: 2024-04-03 21:31:25 浏览: 45
这是一个用于创建链表的函数creat()的代码。其作用如下:
1. 定义结构体指针变量head和p1,用于存储链表节点的地址。
2. 为链表的第一个节点动态分配内存空间,同时将p1指向该节点的地址,并将该节点的num成员从键盘输入。
3. 通过循环,不断为链表添加新的节点,直到输入的num为0为止。在每次循环中,先将p1指向下一个节点的地址,再输入该节点的num成员。
4. 返回链表的头节点head的地址,即可得到创建好的链表。
需要注意的是,该函数中使用了结构体指针变量p1作为游标,不断移动指针来添加新的节点。同时,为了避免内存泄漏,需要在使用完链表后,将链表中所有节点的内存空间释放掉。
相关问题
//动态链表 #include "stdio.h" #include "stdlib.h" #define LEN sizeof(struct Student) struct Student{ long num; float score; struct Student *next; }; int n; //全局变量 struct Student*creat(void) //建立链表 { //此函数无需放入形参 struct Student *head ,*p1,*p2; n=0; p1=p2=(struct Student *)malloc(LEN); scanf("%ld%f",&p1->num,&p1->score); while(p1->num!=0) //此处判断遇 0 代表结束 { n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Student *) malloc(LEN); scanf("%ld%f",&p1->num,&p1->score); } p2->next=NULL; return head; //返回值是链表头 } void del(struct Student *head) //删除结点 { struct Student *p1,*p2,*p; int k,a=n; printf("请输入要删除的结点:\n"); scanf("%d",&k); p1=head; while(n==a&&p1->next!=NULL) { if(head->num==k) //删除的是头结点 { p1=head; // 原头结点 p2= p1->next; // 新的头结点 free(p1); // 释放原头结点内存空间 head =p2; // 头指针向后移一位 n-=1; } p2=p1; p1=p1->next; if(p1->num==k) { p=p1->next; p2->next=p; n-=1; } } } void print(struct Student *head)//输出链表 { struct Student *p; p=head; printf("\nNow,These %d reconds are:\n",n); if(head!=NULL) do { printf("%ld %5.1f\n",p->num,p->score); p=p->next; }while(p!=NULL); } int main() { struct Student *pt; pt=creat(); del(pt); print(pt); return 0; }哪里有错误
代码中存在一个潜在的错误。当删除的是最后一个结点时,程序会陷入死循环,无法退出。具体来说,是由于在while循环中,当p1指向最后一个结点时,p1->next为NULL,但是判断条件却是p1->next!=NULL,导致循环无法结束。应该将判断条件改为p1!=NULL,这样当p1指向最后一个结点时,循环可以正常退出。修改后的代码如下:
```
void del(struct Student *head) //删除结点
{
struct Student *p1,*p2,*p;
int k,a=n;
printf("请输入要删除的结点:\n");
scanf("%d",&k);
p1=head;
while(n==a&&p1!=NULL)
{
if(head->num==k) //删除的是头结点
{
p1=head; // 原头结点
p2= p1->next; // 新的头结点
free(p1); // 释放原头结点内存空间
head =p2; // 头指针向后移一位
n-=1;
}
p2=p1;
p1=p1->next;
if(p1!=NULL && p1->num==k)
{
p=p1->next;
p2->next=p;
n-=1;
}
}
}
```
#include<stdio.h> #include<stdlib.h> struct l{ int a; struct l *next; }; struct l *creat() { struct l *head,*p1,*p2; int n,i; scanf("%d",&n); head=NULL; p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a); p1->next=NULL; head=p1; p2=p1; for(i=0;i<n-1;i++) { p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a);p1->next=NULL; p2->next=p1; p2=p1; } return head; } void printl(struct l *head) { struct l *p; p=head; while(p!=NULL); { printf("%d ",p->a); p=p->next; } } int main() { struct l *head; head=creat(); printl(head); return 0; },这个代码问题在哪
这段代码有两个问题:
1. 在 `printl` 函数中,while 循环的条件中多了一个分号,导致循环体中的语句无法执行,造成无法输出链表中的元素。
2. 在 `main` 函数中,调用 `creat` 函数后没有判断返回的链表头指针是否为 NULL,如果内存分配失败,会返回 NULL,此时调用 `printl` 函数会出现错误。
修改后的代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
struct l{
int a;
struct l *next;
};
struct l *creat() {
struct l *head,*p1,*p2;
int n,i;
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
p1=(struct l *)malloc(sizeof(struct l));
if(p1 == NULL) {
printf("Memory allocation failed.\n");
exit(1);
}
scanf("%d",&p1->a);
p1->next=NULL;
if(head==NULL) {
head=p1;
p2=p1;
} else {
p2->next=p1;
p2=p1;
}
}
return head;
}
void printl(struct l *head) {
struct l *p;
p=head;
while(p!=NULL) // 去掉多余的分号
{
printf("%d ",p->a);
p=p->next;
}
}
int main() {
struct l *head;
head=creat();
if(head == NULL) {
exit(1);
}
printl(head);
return 0;
}
```
阅读全文