C语言:nod *del( nod *head ,int d ) { /**/ /**/ }函数del的功能是:删除链表head中值为d的结点,若查找不到值为d的结点,输出“no”。
时间: 2024-01-17 19:12:42 浏览: 204
这是一个C语言函数,用于删除链表中值为d的节点。函数的具体实现如下:
```c
nod *del(nod *head, int d) {
nod *p, *q;
p = head;
while (p != NULL && p->data != d) {
q = p;
p = p->next;
}
if (p == NULL) {
printf("no");
return head;
}
if (p == head) {
head = p->next;
} else {
q->next = p->next;
}
free(p);
return head;
}
```
这个函数的工作流程是:首先遍历链表,查找值为d的节点。如果找到了,就删除该节点;如果没有找到,就输出“no”。在删除节点时,需要判断要删除的节点是不是头节点,因为头节点的删除需要特殊处理。最后,函数返回删除节点后的链表头。
相关问题
删除链表结点 函数del的功能是:删除链表head中值为d的结点,若查找不到值为d的结点,输出“no”。请在之前已写的代码基础上将del函数和main函数补充完整。 输入格式: 输入分两行,第一行,输入结点的数据域,以空格间隔,最后一个输入0,代表输入结束(0不成为新的结点);第二行输入要删除的数。 输出格式: 对于能查找到d结点,输出执行删除函数后的链表,最后换行;若查找不到值为d的结点,输出“no”,然后换行后输出原链表,最后换行。 输入样例: 在这里给出一组输入。例如: 1 2 3 4 5 6 0 3 输出样例: 在这里给出相应的输出。例如: 1 2 4 5 6 输入样例: 在这里给出一组输入。例如: 1 2 3 4 5 6 0 7 输出样例: 在这里给出相应的输出。例如: no 1 2 3 4 5 6 可以在如下程序中补充代码,也可以自行编写完整代码。 #include<stdio.h> #include<stdlib.h> #define LEN sizeof(nod) typedef struct node { int data; struct node *next; }nod; nod *create() { /**/ /**/ } nod *del( nod *head ,int d ) { /**/ /**/ } void print(nod *head) { /**/ /**/ } int main() { nod *head; int d; head=create();//调用create函数 scanf("%d",&d); head=del(head,d); //调用del函数 print(head); return 0; }
完整代码如下:
```c++
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(nod)
typedef struct node {
int data;
struct node *next;
}nod;
nod *create() {
nod *head,*p1,*p2;
head=NULL;
p1=p2=(nod*)malloc(LEN);
scanf("%d",&p1->data);
while(p1->data!=0) {
if(head==NULL)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(nod*)malloc(LEN);
scanf("%d",&p1->data);
}
p2->next=NULL;
return head;
}
nod *del( nod *head ,int d ) {
nod *p1,*p2;
p1=head;
while(p1!=NULL) {
if(p1->data==d) {
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
return head;
}
else {
p2=p1;
p1=p1->next;
}
}
printf("no\n");
return head;
}
void print(nod *head)
{
nod *p;
p=head;
while(p!=NULL) {
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main() {
nod *head;
int d;
head=create();//调用create函数
scanf("%d",&d);
head=del(head,d); //调用del函数
print(head);
return 0;
}
```
#include <stdio.h> #include <stdlib.h> #define LEN sizeof(nod) typedef struct node { int data; struct node *next; }nod; nod *create() { /**/ /**/ } int count(nod *head) { /**/ /**/ } int main() { nod *head; head=/**/ /**///调用create函数 printf("%d",/**/ /**/); //调用count函数 return 0; }函数count的功能是:返回链表head中结点的个数。需在第一题写完create函数基础上将count函数与main函数补充完整。
下面是完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(nod)
typedef struct node {
int data;
struct node *next;
} nod;
nod *create() {
nod *head, *p1, *p2;
int n, i;
head = NULL;
printf("请输入链表中结点的个数:");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
p1 = (nod *) malloc(LEN);
printf("请输入第%d个结点的值:", i);
scanf("%d", &p1->data);
p1->next = NULL;
if (head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
}
return head;
}
int count(nod *head) {
int num = 0;
nod *p = head;
while (p != NULL) {
num++;
p = p->next;
}
return num;
}
int main() {
nod *head;
head = create();
printf("链表中结点的个数为:%d", count(head));
return 0;
}
```
在create函数中,我们使用了一个for循环来创建链表。首先,我们输入了链表中结点的个数n。然后,我们使用一个指针p1来创建新结点,并输入结点的值。如果链表为空,我们将head指向该结点;否则,我们让p2指向最后一个结点,并将p1挂在p2的后面。最后,我们返回head指针,即链表的头指针。
在count函数中,我们使用了一个while循环来遍历链表。我们定义了一个计数器num,并将其初始化为0。然后,我们使用一个指针p来遍历链表,每经过一个结点,我们就将num加1。最后,我们返回num,即链表中结点的个数。
在main函数中,我们首先调用create函数来创建链表,并将返回的头指针赋值给head。然后,我们调用count函数来计算链表中结点的个数,并将结果输出。
阅读全文