#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(struct nodelink) struct nodelink { long num; char name[20]; struct nodelink *next; }; struct nodelink *create() { struct nodelink *p,q,head=NULL; p=q=(struct nodelink)malloc(LEN); for(int i=0;i<3;i++) { printf("请输入第%d位同学的学号姓名:\n",i+1); scanf("%ld",&p->num); getchar(); scanf("%s",p->name); if(i==0) head=p; else q->next=p; q=p; p=(struct nodelink)malloc(LEN); } p->next=NULL; free(q); return head; } void check(struct nodelink *head,long num) { struct nodelink *p; p=head; int flag=0; while(p!=NULL) { if(p->num==num) { printf("%s\n",p->name); flag=1; break; } p=p->next; } if(flag==0) printf("查无此人!\n"); } void deletes(struct nodelink *head,long num) { struct nodelink *p,*q; int i; for(p=head,q=head->next,i=0;i<10;i++,p=p->next,q=q->next) { if(p->num==num) { p->next=q->next; break; } } printf("修改之后的表格为:\n"); printf("num\tname\n"); while(head!=NULL) { printf("%ld\t%s\n",head->num,head->name); p=p->next; } } int main() { long num,num1; struct nodelink *head; head=create(); printf("请输入您所要查询学生的学号:\n"); scanf("%ld",&num); check(head,num); printf("请输入您所要删除学生的学号:\n"); scanf("%ld",&num1); deletes(head,num1); return 0; }检查一下这个程序的的用处错在什么地方
时间: 2023-12-07 11:05:18 浏览: 65
这个程序存在以下几个错误:
1. 在函数create()中,第4行应该将q初始化为NULL,而不是赋值为一个新的结构体指针。
2. 在函数deletes()中,第11行应该将q指向p的下一个节点,而不是指向head的下一个节点。
3. 在函数deletes()中,第19行应该将head指向head的下一个节点,而不是指向p的下一个节点。
4. 在函数deletes()中,第21行应该将p指向p的下一个节点,而不是指向head的下一个节点。
5. 在函数deletes()中,第24行应该将p指向head,并且需要释放被删除节点的空间。
6. 在函数deletes()中,第25行应该将head指向p,并且需要释放q的空间。
7. 在函数deletes()中,第32行应该将p指向head,并在循环中使用p进行遍历,而不是使用head。
8. 在函数deletes()中,第34行应该将p指向p的下一个节点,而不是指向head的下一个节点。
除此之外,还有一些小问题,比如函数deletes()中的循环次数应该是3,而不是10。另外,在函数deletes()中,如果要删除的节点是头节点,需要特殊处理。
相关问题
#include <stdio.h> #include <windows.h> #include <stdlib.h> #define LEN sizeof(struct Student)
这段代码包含了三个常用的C语言头文件:`stdio.h`用于输入输出操作,`windows.h`通常与Windows API交互相关,而`stdlib.h`提供了标准库函数,如内存管理。
`#define LEN sizeof(struct Student)` 是一个预处理器宏定义,它将计算`struct Student`结构体的大小,并将其赋值给名为LEN的常量。这样,在程序中可以直接使用`LEN`代替`sizeof(struct Student)`来避免在每个使用该结构体大小的地方重复计算。
结构体(struct)`Student`没有在这里直接定义,所以我们不清楚它的具体内容。如果`struct Student`中有变量或成员函数,它的大小会包括这些元素的总和。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(struct nodelink) struct nodelink { long num; char name[20]; struct nodelink *next; }; struct nodelink *create() { struct nodelink *p,*q,*head=NULL; p=q=(struct nodelink*)malloc(LEN); for(int i=0;i<10;i++) { scanf("%ld",&p->num); scanf("%c",p->name); if(i==0) head=p; else p->next=q; p=q; q=(struct nodelink*)malloc(LEN); } p->next=NULL; free(q); return head; } int main() { struct nodelink *head; head=create(); return 0; }
这段代码存在一些问题:
1. 在输入姓名时,应该使用 `scanf("%s", p->name)`,而不是 `scanf("%c", p->name)`。因为 `%c` 只能读取一个字符,而 `%s` 可以读取一个字符串。
2. 在创建链表时,应该先将新节点的指针域设为 NULL,再将上一个节点的指针域指向新节点。因为如果先将上一个节点的指针域指向新节点,再将新节点的指针域设为上一个节点,那么新节点的指针域就会丢失,链表就会断开。
3. 在输入姓名时,应该忽略掉姓名后面的空格和回车符。可以在读取数字后加上一个 `getchar()`。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct nodelink)
struct nodelink {
long num;
char name[20];
struct nodelink *next;
};
struct nodelink *create() {
struct nodelink *p, *q, *head = NULL;
p = q = (struct nodelink*)malloc(LEN);
for(int i = 0; i < 10; i++) {
scanf("%ld", &p->num);
getchar(); // 忽略掉数字后面的回车符
scanf("%s", p->name);
if(i == 0) {
head = p;
} else {
q->next = p;
}
q = p;
p = (struct nodelink*)malloc(LEN);
}
p->next = NULL;
free(p);
return head;
}
int main() {
struct nodelink *head;
head = create();
return 0;
}
```
阅读全文