首页 > 编程语言 >链表(考研算法)

链表(考研算法)

时间:2024-04-23 21:57:02浏览次数:17  
标签:结点 Head next 链表 LList 算法 New 考研

数据结构

链表练习题:

1.已知,一个带有头结点的单链表,结点结构为:假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。

image

/**************************************************************************************
 *
 *
 *  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

相关文章

  • 双向循环链表
    小白感觉双向链表和单向链表的区别并不大,就是地址的交接有点繁琐,需要清晰的逻辑,简单理解就是俩条平行线,无线延伸,但是俩个线不交叉,但都是在一张纸上开始延展,头结点就像这张纸,理解的可能有点抽象,但我感觉这就是个抽象的概念,所以特编写初级的代码如下:/*****************************......
  • 单向循环链表的初体验
    单向循环链表经过小白今天一天的学习,感觉就是在单向链表的尾结点加了一个首结点的地址,不再指向NULL,个人理解就像一群孩子围成了一个圆,头尾相连,同时多少个孩子就是多少个结点,如击鼓传花一般一个个将手上的手绢传递给下一个人,一遍下来就像是单向循环的遍历,想要到谁的手上,就像是指定......
  • 单向循环链表
    //头插boolCircLList_HeadInsert(CircLList_t*Head,DataType_tdata){ //创建一个新节点 CircLList_t*New=CircLList_NewNode(data); //对单向循环链表的头结点的地址进行备份 CircLList_t*Phead=Head; //判断当前链表是否为空,就直接插入 if(Head->next==He......
  • 单向循环链表的接口程序
    自定义单向循环链表的增删改查接口函数/********************************************************************文件名称: 01单向循环链表的接口程序文件作者:[email protected]创建日期:2024/04/23文件功能:对单向循环链表的增删改查功能的定义注意事项:......
  • 单向循环链表——查找、删除、插入结点
    /********************************************************************* filename: CircularLinkedList.c* author :Dazz* date :2024/04/23* function:用于学习单向循环链表,并添加插入、删除、查找结点等函数* note :None** CopyRight(c)202......
  • 单向循环链表(其一)
    单向循环链表(其一)单向循环链表的原理与应用:单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:*单向循环链表的尾结点的指针域中必须指向链表的首结点的地址*,由于带头结点的单向循环链表更加容易进行管理,如下图所示:上图所示的就是一个典型的单向循环链表的结构,......
  • 设计单向循环链表的接口
    /***********************************************************************************filename:003_单向循环链表.cauthor:[email protected]:2024/04/23function:设计单向循环链表的接口note:......
  • 单项循环链表的头插、尾插、中间插、头删、尾删、中间删
    单项循环链表的头插、尾插、中间插、头删、尾删、中间删/******************************************************************** author :[email protected]* date :2024/04/23* function:单项循环链表的头插、尾插、中间插、头删、尾删、中间删* note :Non......
  • 数据结构:单循环链表的创建插入与删除
    数据结构:单循环链表的创建·插入·删除/***@filename: 单循环链表的创建·插入·删除*@brief实现单循环链表的创建删除插入的功能*@[email protected]*@date2024/04/23*@version1.0:版本*@notenoone*CopyRight(c)2023-2024liuliu@......
  • 单向循环链表的接口程序
    /**@filename: main.c@brief单向循环链表的接口程序@[email protected]@date2024/04/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)[email protected]*/include<stdio.h>include......