## 页首HTML代码 ```html

链表(考研算法)

数据结构

链表练习题:

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

image

/**************************************************************************************
 *
 *
 *  file name:  demo__4.c
 *  author   :  tongyaqi1110@163.com
 *  date     :  2024/04/23
 *  function :  设计一个算法,在单链表中查找出倒数第k个位置
 *  note     :  None
 *
 *  CopyRight (c)   2024    Tongyaqi1110@163.com   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;
}
    
posted @ 2024-04-23 21:50  一面小镜子  阅读(85)  评论(0)    收藏  举报