#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
图示:当链表为空时的插入情况
图示:当链表非空时的插入情况
/**
* 从表头到表尾逆向创建链表,包含n个节点
* 需传入表头指针的指针,因为需要对表头指针进行重定向
* 但凡其传入的参数需要改变原值的都需要传入其指针,包括指针本身
* 在p节点后插入in节点方法:in先和p指向相同的后继元,p再指向in
*/
void CreateList(LinkList * L, int n)
{
*L = (LinkList)malloc(sizeof(LNode)); /* 建立头结点 */
(*L)->next = NULL;
LinkList in;
for( ; n>0; n--) {
in = (LinkList)malloc(sizeof(LNode));
scanf("%d",&in->data); /* 创建新的节点 */
in->next = (*L)->next; /* 总是在头结点之后插入 */
(*L)->next = in;
}
}
图示:链表为空,p一开始就指向NULL,不满足直接退出
图示:链表非空,while退出条件是j==i,退出时,p刚好指向第i个节点
图示:链表非空,但i的位置为处没有节点,while退出条件是p==NULL,不满足
/**
* 从链表中获取第 i 个元素的数据。
* 思路:可以从第一个元素开始p和j同步走,如果j=i满足退出,则p指向第i个节点
* 若是空表,则一开始p就为空了,直接返回error
* 若不是空表,但p到达了NULL,说明i不满足,也直接返回error
*/
Status GetElem(LinkList L, int i, ElemType *e)
{
LinkList p = L->next; /* p指向第一个元素 */
int j = 1; /* j从第 1 个元素开始 */
while (p && j<i) { /* 顺指针向后查找,直到p指向第i个元素或p为空 */
p = p->next;
j++;
}
if(!p || j>i)
return ERROR; /* 若p到达NULL,则必然没找到 */
*e = p->data;
return OK;
}
原文:https://www.cnblogs.com/wjundong/p/11619214.html