C语言实现了与前导节点的链表的创建,搜索,插入和删除

电脑杂谈  发布时间:2020-05-05 04:08:22  来源:网络整理

创建带头结点的单链表_二叉树的叶子结点连成链表_创建带头结点的单链表

更新时间: 2014年9月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程序数据结构和算法设计有所帮助.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-199246-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 派迪
        派迪

        哪个不是三高

      • 祖力甫卡尔阿力木
        祖力甫卡尔阿力木

        晒出来啊

      • 王仙仙
        王仙仙

        地球动荡的根过太源歇斯底里了

      热点图片
      拼命载入中...