C语言实现带头结点的链表的创建、查找、插入、删除操作

 更新时间:2014年09月15日 14:47:17   投稿:shichen2014  
这篇文章主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下

本文实例讲述了C语言实现带头结点的链表的创建、查找、插入、删除操作。是数据结构中链表部分的基础操作。分享给大家供大家参考。具体方法如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
  int data;
  struct node* next;// 这个地方注意结构体变量的定义规则
} Node, *PNode;

Node* createLinklist(int length)
{
  int i = 0;
  PNode pHeader = NULL;
  PNode pTail = NULL;
  PNode pTemp = NULL;
  printf("create\n");

  pHeader = (PNode)malloc(sizeof(Node));// 申请头结点
  if (!pHeader)
  {
    exit(-1);
  }
  pHeader->next = NULL;

  for (i = 0; i < length; i++)
  {
    pTemp = (PNode)malloc(sizeof(Node));// 用malloc要包含头文件
    if (!pTemp)
    {
      exit(-1);
    }
    pTemp->data = i*10;
    pTemp->next = NULL;
    if (!pHeader->next)
    {
      // 第一个结点是空的,则先连接第一个结点
      pHeader->next = pTemp;
    }
    else
    {
      pTail->next = pTemp;
    }
    pTail = pTemp;
  }
  return pHeader;
}

Node* search(PNode pHeader, int k)
{
  PNode p = pHeader->next;
  int i = 1;
  printf("search\n");
  while(p && (i < k))
  {
    p = p->next;
    i++;
  }
  if (p && (i == k)) // 这步的i == k是必须的,
  // 因为如果一开始的时候 i就 >= k并且pHeader->next还不为NULL这一步就会必过,导致返回的是第一个元素的值
  {
    return p;
  }
  return NULL;
}

int insert(PNode pHeader, PNode pNew, int k)
{
  PNode p = NULL;
  printf("insert\n");
  if ( 1 == k )
  {
    p = pHeader;
  }
  else
  {
    printf("==>");
    p = search(pHeader, k-1);
  }
  if (p)
  {
    // 带头结点和不带头结点的主要区别之一就在这
    // 如果不带头结点,那么在第一个位置插入结点的操作应该是
    // pNew->next = p;
    // p = pNew;
    // 带头结点的操作如下
    pNew->next = p->next;
    p->next = pNew;
    return 1;
  }
  return 0;
}

int deleteNode(PNode pHeader, int k)
{
  PNode p = NULL;
  printf("deleteNode\n");
  if (1 == k)
  {
    p = pHeader->next;
  }
  else
  {
    printf("==>");
    p = search(pHeader, k-1);
  }
  if (p && p->next)
  {
    // 不带头结点的操作时删除第一个结点的操作
    // Node* temp = p;
    // p = p->next;
    // free(temp);
    // 带头结点的操作如下
    PNode temp = p->next;
    p->next = temp->next;
    free(temp);
    return 1;
  }
  else
  {
    printf("Not Found\n");
    return 0;
  }
}

void print(PNode pHeader)
{
  PNode p = pHeader->next;
  printf("print\n ");
  while(p)
  {
    printf("%4d ", p->data);
    p = p->next;
  }
  putchar('\n');
}

void freeList(PNode pH)
{
  PNode p = NULL;
  printf("freeList\n");
  while(NULL != pH)
  {
    p = pH;
    pH = pH->next;
    printf("%4d be freed\n", p->data);
    free(p);
  }
}

int main(void)
{
  PNode pHeader = NULL;// C和C++中判断指针为空都是用NULL宏(全大写)
  PNode pNew = NULL;
  PNode result = NULL;
  pHeader = createLinklist(10);
  print(pHeader);
  result = search(pHeader, 5);
  if ( result )
  {
    printf("%d\n", result->data);
  }
  else
  {
    printf("Not Found\n");
  }
  pNew = (PNode)malloc(sizeof(Node));
  if (!pNew)
  {
    exit(-1);
  }
  pNew->data = 100;
  pNew->next = NULL;
  insert(pHeader, pNew, 5);
  print(pHeader);
  deleteNode(pHeader, 12);
  print(pHeader);
  freeList(pHeader);
  return 0;
}

上述实例备有较为详尽的注释,相信不难理解。希望本文所述对大家C程序数据结构与算法设计有所帮助。

相关文章

  • C++中实现子进程执行和管道通信详解

    C++中实现子进程执行和管道通信详解

    在这篇博客中,我们将深入探索如何在 C++ 程序中实现子进程的创建与执行,以及父子进程间的管道通信,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C++实现Date类各种运算符重载的示例代码

    C++实现Date类各种运算符重载的示例代码

    这篇文章主要为大家详细介绍了C++实现Date类各种运算符重载的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C语言实现宿舍管理课程设计

    C语言实现宿舍管理课程设计

    这篇文章主要为大家详细介绍了C语言实现宿舍管理课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 如何通过指针突破C++类的访问权限

    如何通过指针突破C++类的访问权限

    这篇文章主要介绍了通过指针突破C++类的访问权限,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • VC++ 中ListCtrl经验总结

    VC++ 中ListCtrl经验总结

    这篇文章主要介绍了VC++ 中ListCtrl经验总结的相关资料,需要的朋友可以参考下
    2015-06-06
  • EasyC++函数模板介绍

    EasyC++函数模板介绍

    这篇文章主要介绍了C++函数模板介绍,所谓函数的模板,本质上也就是使用泛型来定义函数,所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,下面我们一起进入文章详细了解一下C++函数模板,需要的朋友可以参考一下
    2021-12-12
  • Qt实现给窗口绘制阴影的示例代码

    Qt实现给窗口绘制阴影的示例代码

    这篇文章主要为大家详细介绍了Qt实现给窗口绘制阴影的方法,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,感兴趣的可以了解一下
    2022-11-11
  • C++中std::for_each的使用

    C++中std::for_each的使用

    std::for_each是C++标准库中的一个算法,用于遍历容器并对每个元素执行指定的操作,本文就来介绍一下C++中std::for_each的使用,感兴趣的可以了解一下
    2025-04-04
  • C++实现xml解析器示例详解

    C++实现xml解析器示例详解

    这篇文章主要为大家介绍了C++实现xml解析器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • c++先序二叉树的构建详解

    c++先序二叉树的构建详解

    在本篇文章里小编给大家分享了关于c++先序二叉树的构建的相关知识点,需要的朋友们跟着学习下。
    2019-04-04

最新评论