c語言循環雙鏈表解決,雙向鏈表c語言基本操作

本文目錄一覽:

雙向循環鏈表的C語言實現

在工作中的項目有用到雙鏈表,尤其是跟著別人寫雙鏈表代碼的思路,自己去看總覺得沒那麼順,感覺以後也會經常用到,所以索性自己寫一個出來,細節由自己去把握,終於是理解了這一塊,以下是實現雙鏈表的所有源碼:

若是大家有其他想法或者有發現錯誤,歡迎指正哈~

如何創建一個空的c語言雙向循環鏈表

至少需要一個元素,空的不能能建立數據結構。

1.循環鏈表

 循環鏈表是與單鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。循環鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點:

  1)在建立一個循環鏈表時,必須使其最後一個結點的指針指向表頭結點,而不是象單鏈表那樣置為NULL。此種情況還使用於在最後一個結點後插入一個新的結點。

  2)在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。

2.雙向鏈表

  雙向鏈表其實是單鏈表的改進。

  當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有一個存儲直接後繼結點地址的鏈域,那麼能不能定義一個既有存儲直接後繼結點地址的鏈域,又有存儲直接前驅結點地址的鏈域的這樣一個雙鏈域結點結構呢?這就是雙向鏈表。

3.雙向循環鏈表常式:

#include stdio.h

#include stdlib.h

typedef struct tagDbNode

{

 int data;

 struct tagDbNode * left;

 struct tagDbNode * right;

} DbNode, * pdbNode;

//創建結點

pdbNode CreateNode(int data)

{

 pdbNode pnode = (pdbNode)malloc(sizeof(DbNode));

 pnode-data = data;

 pnode-left = pnode-right = pnode; //創建新結點時,讓其前驅和後繼指針都指向自身

 

 return pnode;

}

//創建鏈表

pdbNode CreateList(int head)  //參數給出表頭結點數據 (表頭結點不作為存放有意義數據的結點)

{

 pdbNode pnode = (pdbNode)malloc(sizeof(DbNode));

 pnode-data = head;

 pnode-left = pnode-right = pnode;

 return pnode;

}

//插入新結點,總是在表尾插入; 返回表頭結點

pdbNode InsertNode(pdbNode node, int data) // 參數1是鏈表的表頭結點,參數2是要插入的結點(結

點數據為data)

{

 pdbNode pnode = CreateNode(data);

 

 // 從左到右恢復鏈接

 node-left-right = pnode;

 pnode-right = node;

 

 // 從右到左恢復鏈接

 pnode-left = node-left;

 node-left = pnode;

 

 return node;

}

//查找結點,成功則返回滿足條件的結點指針,否則返回NULL

pdbNode FindNode(pdbNode node, int data) // 參數1是鏈表的表頭結點,參數2是要查找的結點(其中

結點數據為data)

{

 pdbNode pnode = node-right;

 while (pnode != node  pnode-data != data)

 {

  pnode = pnode-right;

 }

 if (pnode == node)  return NULL;

 return pnode;

}

//刪除滿足指定條件的結點, 返回表頭結點, 刪除失敗返回NULL(失敗的原因是不存在該結點)

pdbNode DeleteNode(pdbNode node, int data) // 參數1是鏈表的表頭結點,參數2是要刪除的結點(其

中結點數據為data)

{

 pdbNode pnode = FindNode(node, data);

 if (NULL == pnode) return NULL;

 pnode-left-right=pnode-right;

 pnode-right-left=pnode-left;

 free(pnode);

 return node;

}

//獲取鏈表的長度

int GetLength(pdbNode node) // 參數為鏈表的表頭結點

{

 int nCount = 0;

 pdbNode pnode = node-right;

 while (pnode!= node)

 {

     pnode = pnode-right; 

  nCount++;

 }

 return nCount;

}

//順序列印整個鏈表

void PrintList(pdbNode node) // 參數為鏈表的表頭結點

{

 pdbNode pnode;

 if (NULL == node) return;

 pnode= node-right;

 while (pnode != node)

 {

  printf(“%d   “, pnode-data);

  pnode = pnode -right;

 }

 printf(“\n”);

}

//將鏈表反序列印

void ReverPrint(pdbNode node) //參數為鏈表的表頭結點

{

 pdbNode pnode;

 if (NULL == node) return;

 pnode= node-left;

 while (pnode != node)

 {

  printf(“%d   “, pnode-data);

  pnode = pnode-left;

 }

 printf(“\n”);

}

//刪除鏈表

void DeleteList(pdbNode node) //參數為鏈表表頭結點

{

 pdbNode pnode = node-right;

 pdbNode ptmp;

 if (NULL == node) return;

 

 while (pnode != node)

 {

  ptmp = pnode-right;

  free(pnode);

  pnode = ptmp;

 }

 free(node);

}

//測試程序

#include stdio.h

#include stdlib.h

#include “dblist.h”

#define FALSE 0

#define TRUE  1

typedef unsigned int bool;

void main()

{

 int nChoose;

 int data;

 bool bFlag = FALSE;

 pdbNode pnode;

 pdbNode list = CreateList(0);

 

 while(bFlag == FALSE)

 {

  printf(“Main Menu\n”);

  printf(“1.  Insert\n”);

  printf(“2.  Delete Node\n”);

  printf(“3.  Find\n”);

  printf(“4.  Length\n”);

  printf(“5.  Positive Print\n”);

  printf(“6.  Negative Print\n”);

  printf(“7.  Delete List\n”);

  printf(“0.  quit\n\n”);

 

  scanf(“%d”, nChoose);

 

  switch(nChoose)

  {

  case 1:

   printf(“Input the data to insert:”);

   scanf(“%d”, data);

   list = InsertNode(list, data);

   PrintList(list);

   printf(“\n”);

   break;

  case 2:

   printf(“Input the data to delete: “);

   scanf(“%d”, data);

   DeleteNode(list, data);

   PrintList(list);

   printf(“\n”);

   break;

  case 3:

   printf(“Input the data to find: “);

   scanf(“%d”, data);

   pnode = FindNode(list, data);

      if (NULL != pnode)

   {

    printf(“Find succeed!\n”);

 printf(“\n”);

   }

   else

   {

    printf(“Find failed!\n”);

 printf(“\n”);

   }

   break;

  case 4:

   printf(“The list’s length is %d\n”, GetLength(list));

   printf(“\n”);

   break;

  case 5:

   PrintList(list);

   printf(“\n”);

   break;

  case 6:

   ReverPrint(list);

   printf(“\n”);

   break;

  case 7:

   DeleteList(list);

   printf(“\n”);

   break;

  case 0:

   DeleteList(list);

   bFlag = TRUE;

  }

 }

}

如何創建c語言的雙向循環鏈表

#includestdio.h

#includestdlib.h

#includeiostream

using namespace std;

int n;

typedef struct node

{

int data;

struct node *prior;

struct node *next;

}node,*DoubleLinkList;

void Creat_List(DoubleLinkList L)

{

DoubleLinkList r,s;

cout”請輸入n的值”endl;

cinn;

s = L;

s-prior = s;

s-data = n;

for(int i=0;in;i++)

{

r = (DoubleLinkList)malloc(sizeof(node));

L-next = r;

r-next = s-next;

r-prior = L;

s-next-prior = r;

r-data = i;

L = r;

}

}

void Desplay_List(DoubleLinkList L)

{

DoubleLinkList p;

p = L-next;

for(int i=0;in;i++)

{

cout”輸出:”p-dataendl;

p = p-next;

}

}

void Destroy_List(DoubleLinkList L)

{

DoubleLinkList p;

p = L;

node *temp;

for(int k=0;kn;k++)

{

p = L-next;

temp = p-next;

temp-prior-next = temp-next;

temp-next-prior = temp-prior;

free(temp);

}

cout”空間釋放成功”endl;

}

void main()

{

node a;

DoubleLinkList p;

p = a;

Creat_List(p);

Desplay_List(p);

Destroy_List(p);

}

由於我也不熟悉,我自己保存的創建例子,希望對你有幫助~

C語言循環雙鏈表解決 30個人 每次傳到第三個人就退出 輸出退出的順序

#include stdio.h

#include stdlib.h

typedef struct Node {

int data;

struct Node *next;

//struct Node *last;

}Node;

Node *list_creat(Node *phead,int len) {

Node *p = phead;

int i;

for(i = 1;i = len;i++) {

p-next = (Node *)malloc(sizeof(Node));

p-next-data = i;

p = p-next;

}

p-next = phead;

return phead;

}

/*

void list_remove(Node *phead) {

Node *p = phead;

Node *q=p-last;

Node *qq=p-next;

q-next=qq;

free(p);

}

*/

void list_print(Node *phead,int len,int ren) {

Node *p = phead-next;

while(p != phead) {

printf(“%d “,p-data);

p = p-next;

}

printf(“\n”);

}

int main() {

int ren,zong_ren;

printf(“一共多少人:”);

scanf(“%d”,zong_ren);

printf(“傳第幾次退出:”);

scanf(“%d”,ren);

Node *phead = (Node *)malloc(sizeof(Node));

phead = list_creat(phead,zong_ren);

list_print(phead,zong_ren,ren);

return 0;

}

c語言;不帶頭結點的循環雙鏈表的實現和相關操作

循環雙向鏈表就是節點有2個指針,分別指向前後節點,最終形成O型。

頭結點是用來找到鏈表的,既然你不要頭節點,那我只能用尾節點(最後添加的節點)。

這裡代碼功能:通過添加節點生成鏈表,並通過最後添加的節點找到鏈表並循環列印整個鏈表。

#includestdio.h

#includemalloc.h

int idcont=1;

int listcont=0;//記錄節點個數

typedef struct stList

{

    int id;

    char content[10];

    struct stList *front;

    struct stList *next;

}STL;

STL *InitList();

STL *addList(STL *stl);

void printfSTL(STL *lastSTL);

int main()

{

    char as;

    STL *stl=NULL,*lastSTL=NULL;

    stl=InitList();

    while(1)

    {

        lastSTL=addList(stl);

        printf(“是否繼續添加節點:Y/N? “);

        getchar();

        scanf(“%c”,as);

        if(as==’N’)

            break;

    }

    printfSTL(lastSTL);

    return 0;

}

void printfSTL(STL *lastSTL)

{

    STL *stl=lastSTL;

    printf(“節點編號:%d,內容:%s\n”,stl-id,stl-content);

    stl=stl-next;

    while(stl!=lastSTL)

    {

        printf(“節點編號:%d,內容:%s\n”,stl-id,stl-content);

        stl=stl-next;

    }

}

STL *InitList()

{

    printf(“初始化雙向鏈表\n”);

    STL *stl1=(STL *)malloc(sizeof(STL));

    stl1-front=NULL;

    stl1-next=NULL;

    stl1-id=idcont++;

    return stl1;

}

STL *addList(STL *stl)

{

    STL *stlnew=NULL;

    printf(“請輸入要添加進鏈表的節點內容\n”);

    if(stl-front==NULL)//首節點

    {

        scanf(“%s”,stl-content);

        stl-front=stl;

        stl-next=stl;

    }

    else

    {

        stlnew=(STL *)malloc(sizeof(STL));

        scanf(“%s”,stlnew-content);

        stlnew-front=stl;

        stlnew-next=stl-next;

        stlnew-id=idcont++;

        stl-next=stlnew;

    }

    listcont++;

    return stlnew;

}

c語言編程,合併兩個循環鏈表

首先要以head1為開始點,找到鏈表一中的最後一個節點;

然後以最後一個節點為開始點,指向head2;

最後將鏈表二中的最後一個節點指向鏈表一的開始節點;

這樣就將兩個循環鏈表合併成一個循環鏈表了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/250490.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-13 13:28
下一篇 2024-12-13 13:28

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python磁碟操作全方位解析

    本篇文章將從多個方面對Python磁碟操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件許可權修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29

發表回復

登錄後才能評論