C语言实现带头结点的链表的创建、查找、插入、删除操作_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语言
, 链表
, 插入
, 删除
, 查找
, 操作
, 创建
带头结点
不带头结点的单链表、带头结点的单链表、带头结点的双循环链表、创建带头结点的单链表、建立带头结点的单链表,以便于您获取更多的相关知识。

时间: 2024-11-30 23:10:24

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

结构体链表-c语言链表,输入输出正确但是删除操作报错

问题描述 c语言链表,输入输出正确但是删除操作报错 #include#include#define len sizeof(struct student) struct student{int num;float score;struct student *next;}; struct student *creat(void) // 建立{struct student *p1*p2*head;int n=0;p1=p2=(struct student *)malloc(len);scanf("&q

将数组元素按顺序放入链表中并进行插入删除等操作的编程问题

问题描述 将数组元素按顺序放入链表中并进行插入删除等操作的编程问题 编译无错误,但是无法运行,感觉是将数组当做参数那个地方出了问题,但是不知道具体原因,求助CSDN的朋友帮忙解答,万分感谢 解决方案 大体看了一下首先在list的构造函数中 没有对head进行初始化, 应该是 head = new Node; head->next = null;其次在你的create方法中你并没有将数据放入到以head为头的链表中,我猜你应该是忘记对q初始化,q = head; 给你的建议是加断点一步步调试, 这

c语言-不带头结点的单链表,输出时总是出错,求教!

问题描述 不带头结点的单链表,输出时总是出错,求教! #include#includetypedef enum Status{success,fail,fatal}Status;typedef int ElemType;typedef struct node{ ElemType data; //数据域 struct node *next; //指针域}ListNode,*LinkList;void Build(LinkList L) //创建单链表{ Status status=success;

C++实现哈夫曼树简单创建与遍历的方法_C 语言

本文以实例形式讲述了C++实现哈夫曼树简单创建与遍历的方法,比较经典的C++算法. 本例实现的功能为:给定n个带权的节点,如何构造一棵n个带有给定权值的叶节点的二叉树,使其带全路径长度WPL最小. 据此构造出最优树算法如下: 哈夫曼算法: 1. 将n个权值分别为w1,w2,w3,....wn-1,wn的节点按权值递增排序,将每个权值作为一棵二叉树.构成n棵二叉树森林F={T1,T2,T3,T4,...Tn},其中每个二叉树都只有一个权值,其左右字数为空 2. 在森林F中选取根节点权值最小二叉树,

探讨:将两个链表非降序合并为一个链表并依然有序的实现方法_C 语言

已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点.实现过程中,list1中的节点和list2中的节点都转移到了list3中,注意泛型的友元函数的用法.程序如有不足之处,还望指正!!!定义List类 复制代码 代码如下: #include "stdafx.h"#include <iostream> using namespace std;template<class T>struct Node

C语言实现输出链表中倒数第k个节点_C 语言

本文实例展示了C++实现输出链表中倒数第k个节点的方法,分享给大家供大家参考之用. 运行本文所述实例可实现输入一个单向链表,输出该链表中倒数第k个节点. 具体实现方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; int array[] = {5, 7, 6, 9, 11, 10, 8}; const int size = size

C语言解字符串逆序和单向链表逆序问题的代码示例_C 语言

字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { if(p1==p2)return; //swap the value of p1 ,p2 *p1=(*p1)+(*p2); *p2=(*p1)-(*p2); *p1=(*p1)-(*p2); if(p1==p2-1)return; else stringReverse(++p1,--p2); } 调

c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)_C 语言

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. (1)定义双向链表的基本结构 复制代码 代码如下: typedef struct _DOUBLE_LINK_NODE  {      int data;      struct _DOUBLE_LINK_NODE* prev;      struct _DOUBLE_LINK_NODE* nex

C语言实现在数组A上有序合并数组B的方法_C 语言

本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考.具体分析如下: 题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中 分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include <iostream> #include <algorithm> #include <iterator>