单链表获取指定位置元素

 结点是从0开始计算的

if (p == NULL || pos == 0)
	{
		return head;
	}

p == NULL 代表链表为空,pos == 0 时表示我们要找的是链表中第一个元素的位置,满足这两个条件时都返回头指针head。

for (int i = 0; p && i < pos; i++)
	{
		p = p->next;
	}
	return p;

跳转之后,执行循环操作,判断条件首先需要检测指针p是否为空,而条件 i<pos 则是在确保执行次数,即确定循环到指定位置。循环内部,p = p->next 的执行结果是让p指向p所指向的结点里的 next 指针所指向的位置。

那么,之前已经判断过 p 是否为空,为何在循环条件里边还要加?

我们可以这样解释,如果我们指定的位置超出链表的范围,此时在执行的 p 指向最后一个结点的时候,next 即 p 已经为空,所以此处加上这个条件就可以终止循环。如果不加,那么程序继续执行到循环内部 ,此时让 p 指向 next 程序就会奔溃。

程序代码:

#include <stdio.h>

typedef int DataType;
typedef struct Node
{
	DataType data;
	struct Node *next;
}Node;

Node* getptr(Node* head, int pos)
{
	Node *p = head;
	if (p == NULL || pos == 0)
	{
		return head;
	}
	for (int i = 0; p && i < pos; i++)
	{
		p = p->next;
	}
	return p;
}

int main()
{
	Node *head = NULL;
	//...省略其他操作
	Node *p = getpte(head, 3);
	//...
	return 0;
}

附图:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
``` #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; // 数据域 struct Node *next; // 指针域,指向下一个节点 } Node; // 初始化带头结点的链表 void initList(Node **head) { // 创建头结点 *head = (Node *)malloc(sizeof(Node)); (*head)->next = NULL; } // 建立带头结点的链表 void createList(Node *head) { Node *p = head; int data; printf("请输入数据,以-1结束:\n"); while (1) { scanf("%d", &data); if (data == -1) { break; } // 创建新节点 Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; // 将新节点插入到链表尾部 p->next = newNode; p = p->next; } } // 输出链表中的元素 void printList(Node *head) { Node *p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 求链表长度 int getLength(Node *head) { int length = 0; Node *p = head->next; while (p != NULL) { length++; p = p->next; } return length; } // 获取链表中第i个元素的值 int getElem(Node *head, int i) { int j = 1; Node *p = head->next; while (p != NULL && j < i) { p = p->next; j++; } if (p == NULL) { printf("第%d个元素不存在\n", i); return -1; } return p->data; } // 修改链表中第i个元素的值 void modifyElem(Node *head, int i, int data) { int j = 1; Node *p = head->next; while (p != NULL && j < i) { p = p->next; j++; } if (p == NULL) { printf("第%d个元素不存在\n", i); return; } p->data = data; } // 在链表中第i个位置插入元素 void insertElem(Node *head, int i, int data) { int j = 1; Node *p = head; // 找到第i-1个节点 while (p != NULL && j < i) { p = p->next; j++; } if (p == NULL) { printf("插入位置无效\n"); return; } // 创建新节点 Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = p->next; p->next = newNode; } // 删除链表中第i个元素 void deleteElem(Node *head, int i) { int j = 1; Node *p = head; // 找到第i-1个节点 while (p != NULL && j < i) { p = p->next; j++; } if (p == NULL || p->next == NULL) { printf("删除位置无效\n"); return; } // 删除第i个节点 Node *q = p->next; p->next = q->next; free(q); } int main() { Node *head; initList(&head); createList(head); printf("链表中的元素为:"); printList(head); int length = getLength(head); printf("链表的长度为:%d\n", length); int elem = getElem(head, 3); printf("链表中第3个元素为:%d\n", elem); modifyElem(head, 3, 10); printf("修改后链表中第3个元素为:%d\n", getElem(head, 3)); insertElem(head, 2, 5); printf("在链表中第2个位置插入元素5后,链表中的元素为:"); printList(head); deleteElem(head, 4); printf("删除链表中第4个元素后,链表中的元素为:"); printList(head); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值