在带头结点单链表中查找第i个结点,完成函数 node *find(node *head, int i)的功能。
时间: 2024-02-20 14:58:27 浏览: 24
好的,这是一个比较简单的链表问题。以下是代码实现:
```c++
typedef struct node{
int data;
struct node *next;
}node;
node *find(node *head, int i){
if(head == NULL || i <= 0) // 非法输入
return NULL;
node *p = head->next; // 从第一个结点开始
int j = 1;
while(p != NULL && j < i){ // 遍历链表
p = p->next;
j++;
}
if(j == i) // 找到第i个结点
return p;
else // 链表中没有第i个结点
return NULL;
}
```
函数的参数是一个带头结点的链表头指针和要查找的结点位置i。首先需要判断输入的参数是否合法,即链表是否为空或者i是否小于等于0,如果是则直接返回NULL。接着从第一个结点开始遍历链表,每遍历一个结点就将计数器j加1,直到找到第i个结点或者遍历到链表末尾。如果找到了第i个结点,则返回该结点的指针,否则返回NULL。
相关问题
#include<stdio.h> #include<stdlib.h> #define LEN sizeof(nod) typedef struct node { int data; struct node *next; }nod; nod *create() { /**/ /** / } void find (nod *head,int i) { /**/ /**/ } int main() { nod *head;int i; head=/**/ /**/;//调用create函数 scanf("%d",&i); /**/ /**/; //调用find函数 return 0; }f查找链表第i个结点 函数find的功能是:查找链表head中的第i个结点(结点从1开始编号),查找到输出第i个节点的值,若不存在第i个结点,输出“no”。请在之前已写的代码基础上将find函数和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;
}
void find(nod *head, int i) {
int j = 1;
nod *p = head;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i)
printf("no");
else
printf("%d", p->data);
}
int main() {
nod *head;
int i;
head = create();
printf("请输入要查找的结点编号:");
scanf("%d", &i);
find(head, i);
return 0;
}
```
在find函数中,我们使用了一个while循环来遍历链表。我们定义了一个指针p来遍历链表,并定义了一个计数器j来记录当前遍历到的结点编号。如果p为NULL或j大于i,说明不存在第i个结点,我们输出"no";否则,我们输出第i个结点的值。
在main函数中,我们首先调用create函数来创建链表,并将返回的头指针赋值给head。然后,我们输入要查找的结点编号i,并调用find函数来查找链表中的第i个结点。最后,我们输出结果。
函数find_middle()实现了对给定的单链表,查找到其中间结点。如果中间结点为两个,返回前面的那个结点的地址。请完成该函数。 函数接口定义: Node* find_middle(Node* head); head是单链表的头指针,函数返回查找到的结点地址。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { int num; struct ListNode *next; }Node; Node *createlist(); /*裁判实现,细节不表*/ Node* find_middle(Node* head); void display(Node *head);/*裁判实现,细节不表*/ int main() { Node *head,*p; head = createlist(); p = find_middle(head); display(p); return 0; } /* 请在这里填写答案 */ 输入样例1: 5 1 3 7 9 10 输出样例1: 7
```
Node* find_middle(Node* head) {
Node *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
```