最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作

 更新時間:2014年09月15日 14:47:17   投稿:shichen2014  
這篇文章主要介紹了C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作方法,對于了解數(shù)據(jù)結(jié)構(gòu)中鏈表的各項操作有很好的借鑒價值,需要的朋友可以參考下

本文實例講述了C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作。是數(shù)據(jù)結(jié)構(gòu)中鏈表部分的基礎(chǔ)操作。分享給大家供大家參考。具體方法如下:

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

typedef struct node
{
  int data;
  struct node* next;// 這個地方注意結(jié)構(gòu)體變量的定義規(guī)則
} 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));// 申請頭結(jié)點
  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)
    {
      // 第一個結(jié)點是空的,則先連接第一個結(jié)點
      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這一步就會必過,導(dǎo)致返回的是第一個元素的值
  {
    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)
  {
    // 帶頭結(jié)點和不帶頭結(jié)點的主要區(qū)別之一就在這
    // 如果不帶頭結(jié)點,那么在第一個位置插入結(jié)點的操作應(yīng)該是
    // pNew->next = p;
    // p = pNew;
    // 帶頭結(jié)點的操作如下
    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)
  {
    // 不帶頭結(jié)點的操作時刪除第一個結(jié)點的操作
    // Node* temp = p;
    // p = p->next;
    // free(temp);
    // 帶頭結(jié)點的操作如下
    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程序數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計有所幫助。

相關(guān)文章

  • C++中實現(xiàn)子進程執(zhí)行和管道通信詳解

    C++中實現(xiàn)子進程執(zhí)行和管道通信詳解

    在這篇博客中,我們將深入探索如何在 C++ 程序中實現(xiàn)子進程的創(chuàng)建與執(zhí)行,以及父子進程間的管道通信,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C++實現(xiàn)Date類各種運算符重載的示例代碼

    C++實現(xiàn)Date類各種運算符重載的示例代碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)Date類各種運算符重載的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語言實現(xiàn)宿舍管理課程設(shè)計

    C語言實現(xiàn)宿舍管理課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)宿舍管理課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 如何通過指針突破C++類的訪問權(quán)限

    如何通過指針突破C++類的訪問權(quán)限

    這篇文章主要介紹了通過指針突破C++類的訪問權(quán)限,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • VC++ 中ListCtrl經(jīng)驗總結(jié)

    VC++ 中ListCtrl經(jīng)驗總結(jié)

    這篇文章主要介紹了VC++ 中ListCtrl經(jīng)驗總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • EasyC++函數(shù)模板介紹

    EasyC++函數(shù)模板介紹

    這篇文章主要介紹了C++函數(shù)模板介紹,所謂函數(shù)的模板,本質(zhì)上也就是使用泛型來定義函數(shù),所謂的泛型其實也就是不定的類型,比如說我們使用vector的時候,可以定義各種類型的vector,下面我們一起進入文章詳細了解一下C++函數(shù)模板,需要的朋友可以參考一下
    2021-12-12
  • Qt實現(xiàn)給窗口繪制陰影的示例代碼

    Qt實現(xiàn)給窗口繪制陰影的示例代碼

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)給窗口繪制陰影的方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)Qt有一定的幫助,感興趣的可以了解一下
    2022-11-11
  • C++中std::for_each的使用

    C++中std::for_each的使用

    std::for_each是C++標準庫中的一個算法,用于遍歷容器并對每個元素執(zhí)行指定的操作,本文就來介紹一下C++中std::for_each的使用,感興趣的可以了解一下
    2025-04-04
  • C++實現(xiàn)xml解析器示例詳解

    C++實現(xiàn)xml解析器示例詳解

    這篇文章主要為大家介紹了C++實現(xiàn)xml解析器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • c++先序二叉樹的構(gòu)建詳解

    c++先序二叉樹的構(gòu)建詳解

    在本篇文章里小編給大家分享了關(guān)于c++先序二叉樹的構(gòu)建的相關(guān)知識點,需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04

最新評論

新乡市| 常山县| 塘沽区| 灵山县| 德兴市| 防城港市| 台北县| 进贤县| 竹山县| 榆中县| 陇南市| 南皮县| 阿克陶县| 乐平市| 东丽区| 永寿县| 济南市| 阜宁县| 宝丰县| 康平县| 北辰区| 永仁县| 东方市| 池州市| 南郑县| 夏邑县| 迁安市| 沙坪坝区| 曲阜市| 漳浦县| 天气| 昭平县| 平泉县| 会东县| 永康市| 姚安县| 永清县| 招远市| 习水县| 怀柔区| 通榆县|