程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話完成帶頭結點的鏈表的創立、查找、拔出、刪除操作

C說話完成帶頭結點的鏈表的創立、查找、拔出、刪除操作

編輯:關於C++

C說話完成帶頭結點的鏈表的創立、查找、拔出、刪除操作。本站提示廣大學習愛好者:(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法式數據構造與算法設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved