数据结构
链表练习题:
1.已知,一个带有头结点的单链表,结点结构为:假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。
/**************************************************************************************
*
*
* file name: demo__4.c
* author : [email protected]
* date : 2024/04/23
* function : 设计一个算法,在单链表中查找出倒数第k个位置
* note : None
*
* CopyRight (c) 2024 [email protected] All Right Reserved
*************************************************************************************/
#include <stdio.h>
// 指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改
#include <stdlib.h>
#include <stdbool.h>
typedef int DataType_t;
// 构造链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedList
{
DataType_t data; // 结点的数据域
struct LinkedList *next; // 结点的指针域
} LList_t;
// 创建一个空链表,空链表应该有一个头结点,对链表进行初始化
LList_t *LList_Create(void)
{
// 1.创建一个头结点并对头结点申请内存
LList_t *Head = (LList_t *)calloc(1, sizeof(LList_t));
if (NULL == Head)
{
perror("Calloc memory for Head is Failed");
exit(-1);
}
// 2.对头结点进行初始化,头结点是不存储有效内容的!!!
Head->next = NULL;
// 3.把头结点的地址返回即可
return Head;
}
// 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LList_t *LList_NewNode(DataType_t data)
{
// 1.创建一个新结点并对新结点申请内存
LList_t *New = (LList_t *)calloc(1, sizeof(LList_t));
if (NULL == New)
{
perror("Calloc memory for NewNode is Failed");
return NULL;
}
// 2.对新结点的数据域和指针域进行初始化
New->data = data;
New->next = NULL;
return New;
}
// 头插
bool LList_HeadInsert(LList_t *Head, DataType_t data)
{
// 1.创建新的结点,并对新结点进行初始化
LList_t *New = LList_NewNode(data);
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
// 2.判断链表是否为空,如果为空,则直接插入即可
if (NULL == Head->next)
{
Head->next = New;
return true;
}
// 3.如果链表为非空,则把新结点插入到链表的头部
New->next = Head->next;
Head->next = New;
return true;
}
LList_t *Last = NULL;
LList_t *First = NULL;
int FindLast_K(LList_t *Head)
{
int k;
LList_t *Last = Head->next;
LList_t *First = Head->next;
printf("请输入倒数第k个位置的值");
scanf("%d", &k);
// Last指针往后移动k-1个单位
for (int i = 1; i < k; i++)
{
Last = Last->next;
}
// First指针去寻找k的值
while (Last->next)
{
Last = Last->next;
First = First->next;
}
printf("最后k的值为%d\n", First->data);
}
void LList_Print(LList_t *Head)
{
// 对链表的头文件的地址进行备份
LList_t *Phead = Head;
// 首结点
printf("给定了这串链表");
while (Phead->next)
{
// 把头的直接后继作为新的头结点
Phead = Phead->next;
// 输出头结点的直接后继的数据域
printf("%d ", Phead->data);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
LList_t *Head = LList_Create();
LList_HeadInsert(Head, 4);
LList_HeadInsert(Head, 9);
LList_HeadInsert(Head, 6);
LList_HeadInsert(Head, 0);
LList_HeadInsert(Head, 7);
LList_HeadInsert(Head, 2);
LList_Print(Head);
FindLast_K(Head);
return 0;
}
标签:结点,Head,next,链表,LList,算法,New,考研
From: https://www.cnblogs.com/little-mirror/p/18153840