當前位置:首頁 » 編程語言 » c語言環形鏈表
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言環形鏈表

發布時間: 2022-06-26 03:44:46

㈠ 用c語言怎麼證明一個鏈表是一個環形鏈表呀

圖呢?
沒圖只能猜了
首先
b和d是完全相同的
只是表現方式不一樣
而a至少有可能把q插入到鏈表末尾
c選項
q->next=p
則是把q的next指向了p
後頭怎麼操作就不用管了
反正不是指向null就是不對的
(除非是循環鏈表)
所以選c

㈡ 在C語言中,什麼是鏈表呀

鏈表
鏈表鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,鏈表比較方便插入和刪除操作。

概況
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針(Pointer)。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表:順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而順序表相應的時間復雜度分別是O(logn)和O(1)。使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。在計算機科學中,鏈表作為一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向明上一個/或下一個節點的位置的鏈接("links")。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,[1]但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。鏈表可以在多種編程語言中實現。像Lisp和Scheme這樣的語言的內建數據類型中就包含了鏈表的存取和操作。程序語言或面向對象語言,如C,C++和Java依靠易變工具來生成鏈表。
編輯本段特點
線性表的鏈式存儲表示的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。因此,為了表示每個數據元素 與其直接後繼數據元素 之間的邏輯關系,對數據元素 來說,除了存儲其本身的信息之外,還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)。由這兩部分信息組成一個"結點"(如概述旁的圖所示),表示線性表中一個數據元素 。
編輯本段擴展
根據情況,也可以自己設計鏈表的其它擴展。但是一般不會在邊上附加數據,因為鏈表的點和邊基本上是一一對應的(除了第一個或者最後一個節點,但是也不會產生特殊情況)。不過有一個特例是如果鏈表支持在鏈表的一段中把前和後指針反向,反向標記加在邊上可能會更方便。 對於非線性的鏈表,可以參見相關的其他數據結構,例如樹、圖。另外有一種基於多個線性鏈表的數據結構:跳錶,插入、刪除和查找等基本操作的速度可以達到O(nlogn),和平衡二叉樹一樣。 其中存儲數據元素信息的域稱作數據域(設域名為data),存儲直接後繼存儲位置的域稱為指針域(設域名為next)。指針域中存儲的信息又稱做指針或鏈。 由分別表示,,…, 的N 個結點依次相鏈構成的鏈表,稱為線性表的鏈式存儲表示,由於此類鏈表的每個結點中只包含一個指針域,故又稱單鏈表或線性鏈表.
編輯本段三個鏈表函數(C語言描述)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
struct Node{
int data;//數據域
struct Node * next;//指針域
}; /************************************************************************************** *函數名稱:insert
*函數功能:在鏈表中插入元素. *輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容 *輸出:無 *************************************************************************************/ void insert(Node * head,int p,int x)
{ Node * tmp = head; //for循環是為了防止插入位置超出了鏈表長度 for(int i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
Node * tmp2 = new Node;
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
} /************************************************************************************** *函數名稱:del *函數功能:刪除鏈表中的元素 *輸入:head 鏈表頭指針,p 被刪除元素位置 輸出:被刪除元素中的數據域.如果刪除失敗返回-1 **************************************************************************************/
int del(Node * head,int p)
{
Node * tmp = head;
for(int i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
int ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
void print(Node *head)
{
for(Node *tmp = head;
tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
int main()
{
Node * head;
head = new Node;
head->data = -1;
head->next=NULL;
return 0;
}
編輯本段結語
C語言是學習數據結構的很好的學習工具。理解了C中用結構體描述數據結構,那麼對於理解其C++描述,Java描述都就輕而易舉了!

編輯本段兩種鏈表形式
一、循環鏈表 循環鏈表是與單鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。 循環鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點: 1、在建立一個循環鏈表時,必須使其最後一個結點的指針指向表頭結點,而不是象單鏈表那樣置為NULL。此種情況還使用於在最後一個結點後插入一個新的結點。 2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。
二、雙向鏈表 雙向鏈表其實是單鏈表的改進。 當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有一個存儲直接後繼結點地址的鏈域,那麼能不能定義一個既有存儲直接後繼結點地址的鏈域,又有存儲直接前驅結點地址的鏈域的這樣一個雙鏈域結點結構呢?這就是雙向鏈表。 在雙向鏈表中,結點除含有數據域外,還有兩個鏈域,一個存儲直接後繼結點地址,一般稱之為右鏈域;一個存儲直接前驅結點地址,一般稱之為左鏈域。

㈢ c語言創建環鏈表的問題,這里的環鏈表應該怎樣寫呢

樓主的代碼有點亂,我把我用的代碼給你看下吧
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node *ptNode;
struct node
{
char name[20];
ptNode lLink,rLink;
};/*雙鏈表的結構定義*/

/*雙鏈表的創建*/
ptNode Creat(int n)
{
ptNode head,ptr,newnode;
int i;
if((head=(ptNode)malloc(sizeof(node))) == NULL)
{
printf("cannot find space!\n");
exit(0);
}

head->name[0] = '\0';//頭結點初始化
head->lLink = NULL;
head->rLink = NULL;
ptr = head;

for(i=0; i<n; i++)
{
if((newnode=(ptNode) malloc(sizeof(node))) == NULL)
{
printf("cannot find space!\n");
exit(0);
}
ptr->rLink = newnode;//連接新結點
printf("Please input the %d man's name: ",i+1);
scanf("%s",newnode->name);
newnode->lLink = ptr;//定義newnode的連接關系
newnode->rLink = NULL;
ptr = newnode;
}//end for

head->lLink = newnode;
ptr->rLink = head;
return(head);
}
void main(void)
{
int number;
ptNode head;
puts("Please input the size of the list:");
scanf("%d",&number);
head = Creat(number);
}

㈣ c語言 鏈表是什麼。書上的沒看太懂

由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表:順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而順序表相應的時間復雜度分別是O(logn)和O(1)。使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。在計算機科學中,鏈表作為一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向明上一個/或下一個節點的位置的鏈接("links")。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,[1]但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。鏈表可以在多種編程語言中實現。像Lisp和Scheme這樣的語言的內建數據類型中就包含了鏈表的存取和操作。程序語言或面向對象語言,如C,C++和Java依靠易變工具來生成鏈表。 [編輯本段]特點 線性表的鏈式存儲表示的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。因此,為了表示每個數據元素 與其直接後繼數據元素 之間的邏輯關系,對數據元素 來說,除了存儲其本身的信息之外,還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)。由這兩部分信息組成一個"結點"(如概述旁的圖所示),表示線性表中一個數據元素 。 [編輯本段]擴展 根據情況,也可以自己設計鏈表的其它擴展。但是一般不會在邊上附加數據,因為鏈表的點和邊基本上是一一對應的(除了第一個或者最後一個節點,但是也不會產生特殊情況)。不過有一個特例是如果鏈表支持在鏈表的一段中把前和後指針反向,反向標記加在邊上可能會更方便。 對於非線性的鏈表,可以參見相關的其他數據結構,例如樹、圖。另外有一種基於多個線性鏈表的數據結構:跳錶,插入、刪除和查找等基本操作的速度可以達到O(nlogn),和平衡二叉樹一樣。 其中存儲數據元素信息的域稱作數據域(設域名為data),存儲直接後繼存儲位置的域稱為指針域(設域名為next)。指針域中存儲的信息又稱做指針或鏈。 由分別表示,,…, 的N 個結點依次相鏈構成的鏈表,稱為線性表的鏈式存儲表示,由於此類鏈表的每個結點中只包含一個指針域,故又稱單鏈表或線性鏈表. [編輯本段]三個鏈表函數(C語言描述) #include #include struct Node{ int data;//數據域 struct Node * next;//指針域 }; /************************************************************************************** *函數名稱:insert *函數功能:在鏈表中插入元素. *輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容 *輸出:無 *************************************************************************************/ void insert(Node * head,int p,int x){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return ; } Node * tmp2 = new Node; tmp2->data = x; tmp2->next = tmp->next; tmp->next = tmp2; } /************************************************************************************** *函數名稱:del *函數功能:刪除鏈表中的元素 *輸入:head 鏈表頭指針,p 被刪除元素位置 輸出:被刪除元素中的數據域.如果刪除失敗返回-1 **************************************************************************************/ int del(Node * head,int p){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return -1; } int ret = tmp->next->data; tmp->next = tmp->next->next; return ret; } void print(Node *head,Node * root){ for(Node *tmp = head; tmp!=NULL; tmp = tmp->next) printf("%d ",tmp->data); printf("\n"); } int main(){ Node * head; head = new Node; head->data = -1; head->next=NULL; return 0; } [編輯本段]結語 C語言是學習數據結構的很好的學習工具。理解了C中用結構體描述數據結構,那麼對於理解其C++描述,Java描述都就輕而易舉了! [編輯本段]兩種鏈表形式 一、循環鏈表 循環鏈表是與單鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。 循環鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點: 1、在建立一個循環鏈表時,必須使其最後一個結點的指針指向表頭結點,而不是象單鏈表那樣置為NULL。此種情況還使用於在最後一個結點後插入一個新的結點。 2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。 二、雙向鏈表 雙向鏈表其實是單鏈表的改進。 當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有一個存儲直接後繼結點地址的鏈域,那麼能不能定義一個既有存儲直接後繼結點地址的鏈域,又有存儲直接前驅結點地址的鏈域的這樣一個雙鏈域結點結構呢?這就是雙向鏈表。 在雙向鏈表中,結點除含有數據域外,還有兩個鏈域,一個存儲直接後繼結點地址,一般稱之為右鏈域;一個存儲直接前驅結點地址,一般稱之為左鏈域。

㈤ c語言環形隊列 鏈表 和數組的區別

隊列先進先出 適合用於排序
鏈表適合用於存儲
C的數組就是指針 適合用於查詢

㈥ C語言 環鏈表怎麼全部輸出求編寫output 函數

思路很簡單,用一個for循環,從當前節點開始輸出,循環次數是節點的count。

㈦ C語言鏈表

#include "stdio.h"
#include "stdlib.h" //頭文件
#define S struct Worker
#define LEN sizeof(S) //宏定義結構體名字 長度
struct Worker //結構體
{
int num;
char name[20];
float pay;
S *next; //指向下一元素的指針,關鍵
};
main ()
{
int i;
S *p,*q,*head; //p新的節點,q用於插入新的節點,head頭節點
p=q=head=(S*)malloc(LEN); //分配空間,讀入
scanf ("%d%s%f",&p->num,p->name,&p->pay); //依次輸入結構的 num name pay
p=(S*)malloc(LEN); //動態分配空間,新的節點
scanf ("%d%s%f",&p->num,p->name,&p->pay); //依次輸入結構的 num name pay
q->next=p; //確定下一個元素指針,再次讀入
q=p; //指向新的節點
p=(S*)malloc(LEN); //動態分配空間,新的節點
scanf ("%d%s%f",&p->num,p->name,&p->pay); //依次輸入結構的 num name pay
q->next=p; //插入新的節點
q=p; //指向新的節點
q->next=0; //最後的節點的next==0
p=head; //把頭節點的地址給 p
while (p!=0) //如果不是最後一個節點
{
printf ("%d,%s,%0.1f\n",p->num,p->name,p->pay); //輸出結構的變數
p=p->next; //指向下個節點
}
}

鏈表這個東西,就算全部給你解釋,我想你也看不全懂啊,自己畫個圖,然後自己想想啊,看代碼是沒有很好的效果的啊,還有,第一次學鏈表的時候,那個結構不要那麼多變數啊,一個num就好啊,容易理解啊.祝你成功.

㈧ C語言鏈表輸出函數功能 求解答! 請問有些什麼功能

鏈表分類型有:單鏈表、雙鏈表、單向環形鏈表、雙向環形鏈表。
單鏈表:只有一個頭節點為入口,並且每一個節點只有一個單向地址指向下一個節點,簡單的說在後一個節點無法返回上一個節點。
雙鏈表:有頭節點和尾節點作為入口,每一個節點有兩個地址,一個指向前一個節點,一個指向後一個節點。解決了單鏈表無法返回前一個節點的問題。
單向環形鏈表:這是一個特殊的單鏈表,這個鏈表是把它的最後一個節點地址指向首節點的入口處。如果它要查找前一個節點的時候需要,轉回首節點然後才能到達前一個節點。
雙向環形鏈表:顧名思義,構成環形結構的雙向鏈表。

㈨ C語言中有關鏈表的問題

for(p1=head;p1<head+n;p1++)
printf("%d ",p1->num);
這步有點問題。
其中p1++隱含的假設是鏈表所有元素是像數組一樣在內存中連續存放的。
但是按照前面的代碼,所有元素的內存是通過malloc動態分配的,因此p1++並不能移動到下一個元素處。
並且,既然是鏈表的實現,應該充分利用鏈表的next指針。
可以重寫如下:
p1=head;
for(i=0;i<n;++i)
{
printf("%d ",p1->num);
p1=p1->next;
}

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

只是雙向給你參考... 加個循環對你應該問題不大吧...