❶ c語言怎麼建一個鏈表,書上的看不懂,求圖解,詳解。高分!!!
學習鏈表 基礎知識 指針和結構體
先建立一個結構體,結構體包含一個數據域和一個指向結構體的指針
比如
typedef struct{
int data; //數據域
PCHAIN pNext; //指向下一個數據
}CHAIN,*PCHAIN;
接著把數據相接起來 比如
PCHAIN pHeader; //這是一個頭 指向數據開頭
CHAIN tChainData1,tChainData2; //第一個數據 第二個數據.....
pHeader=&tChainData1; //指向第一個數據
tChainData1.pNext=&tChainData2; //第一個數據 連接第二個數據 依次類推
這只是我隨便寫的簡單鏈表,不過大意都是這樣的
❷ C語言鏈表的使用方法
D
答案D設置完,p就從鏈表中丟掉了。
p就是一個指向結構體node的指針。
p->next就是p包含的執行下一個node的指針,在本題,就是q。
❸ C語言 鏈表 如何理解
滿意答案飛狙仔16級2011-01-18別聽那人忽悠你,想學數據結構並不需要鏈表的基礎。當然,鏈表也很重要,以線性表為例:鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,鏈表比較方便插入和刪除操作。 追問: 前輩,能發個代碼上來說明一下嗎?書本上的我看不明白。 回答: 比如:#include #include struct link{int data;struct link *next; }; void create(struct link *h,int n){int i;struct link *k; h=(struct link *)malloc(sizeof(struct link)); h-> next=NULL; for(i=n;i> 0;i--){k=(struct link *)malloc(sizeof(struct link));k->data=i;k->next=h->next;h->next=k;}k=h->next;for(i=0;idata);k=k->next;}printf("\n"); }int main(){struct link l; system("pause");return 0;} 結果: 追問: 前輩,不是C++的頭文件嗎? 回答: 你不是說C語言的鏈表嗎?就得自己寫個數據結構。C++默認的鏈表類是基於STL的。建議你看一下書。 追問: 啊?我C語言都沒有學好,就去看C++? 回答: 呵呵,不是這個意思。剛才那個程序是C的。C++的STL中有自帶的鏈表類,建議你以後學習。把握鏈表,核心是結點,結點核心就是數據+指針。多看幾個例子,比如嚴蔚敏的數據結構,就寫的很好。
❹ 求c語言鏈表的詳細講解
鏈表是一種常見的重要的數據結構.它是動態地進行存儲分配的一種結構.我們知道,用數組存放數據時,
必須事先定義固定的長度(即元素個數).比如,有的班級有100人,而有的班只有30人,如果要用同一個數組先後存放不同班級的學生數據,則必須定義長度為100的數組.如果事先難以確定一個班的最多人數,則必須把數組定得足夠大,以能存放任何班級的學生數據.顯然這將會浪費內存.鏈表則沒有這種缺點,它根據需要開辟內存單元.圖10.11表示最簡單的一種鏈表(單向鏈表)的結構.鏈表有一個"頭指針"變數,圖中以head表示,它存放一個地址.
該地址指向一個元素.鏈表中每一個元素稱為"結點",每個結點都應包括兩個部分:一為用戶需要用的實際數據,二為下一個結點的地址.課以看出,head指向第一個元素;第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為'表尾",它的地址部分放一個"NULL"(表示"空地址").鏈表到此結束.
可以看到:鏈表中各元素在內存中可以不是連續存放的.要找某一元素,必須先找到上一個元素,根據它提供的下一元素地址才能找到下一個元素.
如果不提供"頭指針"(head),則整個鏈表都無法訪問.鏈表如同一條鐵鏈一樣,一環扣一環,中間是不能斷開的.打個通俗的比方:幼兒園的老師帶領孩子出來散步,老師牽著第一個小孩的手,第一個小孩的另一隻手牽著第二個孩子,……,這就是一個"鏈",最後一個孩子有一隻手空著,他是"鏈尾".要找這個隊伍,必須先找到老師,然後順序找到每一個孩子.
❺ c語言中鏈表講解視頻教程
1.圖文教程:
網路文庫、新浪愛問里搜索;
2.視頻教程:
網易視頻學院、網路課程、優酷、51自學網里搜索,應該會有;
及各網站的公開課
3.下載地址:
網路搜索【逛電驢】和【迅雷方舟】然後轉到逛電驢網與迅雷方舟網可進行資源搜索及下載
另外網路文庫里的文檔也有許多下載地址
4.復制地址後用迅雷下載即可
5.------------------@選為滿意答案@------------------
❻ c語言鏈表逆置詳解
思路 ==》創建一個新的鏈表,然後順序遍歷原鏈表,將其每一項都前插到新鏈表中。這樣得到的新鏈表就是原鏈表的逆向鏈表例子看下面的#include <stdio.h>
//結構體,用整數作數據
typedef struct tNODE
{
int data;
struct tNODE *next;
}NODE;
//刪除鏈表,回收空間
void clear(NODE *head)
{
NODE *p;
while(head)
{
p=head->next;//保存下一個結點的地址
free(head);//刪除最先的一個結點
head=p;//指向下一個結點
}
}
//輸出整個鏈表中的數據
void write(NODE *head)
{
NODE *p;
p=head->next;//因為使用帶頭結點的鏈表,所以要跳過第一個結點
while(p)
{
printf("%d ", p->data);
p=p->next;//後移
}
printf("\n");
}
//鏈表逆序
void reverse(NODE *head)
{
NODE *p, *q, *r;
if(head->next)//至少有一個數據
{
p=head->next;//p指向第一個數據結點
q=p->next;//q指向第二個結點
p->next=NULL;//第一個結點逆序後當然就是最後一個
while(q)
{
r=q->next;//r指向第三個結點
q->next=p;//第二個結點的鏈指針指向第一個
p=q;//p指向第二個結點
q=r;//q指向第三個結點
}
head->next=p;//讓始終沒理的頭結點連到最後一個結點上
}
}
//生成鏈表,以-1表示結束
NODE *create()
{
NODE *h, *t;
int x;
h=malloc(sizeof(NODE));//建立頭結點
t=h;
scanf("%d", &x);
while(x!=-1)
{
t->next=malloc(sizeof(NODE));
t=t->next;
t->data=x;
scanf("%d", &x);
}
t->next=NULL;
return h;
}
int main()
{
NODE *head;
head=create();
write(head);
reverse(head);
write(head);
clear(head);
return 0;
}
❼ C語言中的鏈表怎麼理解
鏈表是相同類型的若干個結構體用其自身攜帶的指針按照一定順序串聯成的一個鏈。
舉個簡單例子進行類比:
struct node{
int a;
struct node *next;
};
把這個鏈表節點的結構體struct node看作是人,結構體內的next指針看作是人的一隻手,這只手只能用於指向人(別人或自己)。
如果有多個人排成一排,每個人都舉起右手指向右邊的人,就形成一個人組成的鏈表。
❽ 在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語言鏈表的思路
鏈表的一種數據格式:
typedefintDataType;
typedefstructLinkNode
{
DataTypedata;
structLinkNode*next;
}LinkNode;
LinkNode*Create_LinkList()
{
LinkNode*h=NULL;//指向鏈表第一個數據節點
LinkNode*tail=NULL;//指向鏈表最後一個節點
while(1)
{
//用戶不斷的輸入數據,直到輸入負數
intinput;
scanf("%d",&input);
if(input<0){
break;
}
//申請新節點內存
LinkNode*newNode=(LinkNode*)malloc(sizeof(LinkNode));
//設置新節點的next
newNode->next=NULL;
//填充數據
newNode->data=input;
//添加到鏈表尾
if(h==NULL){
//若表頭為NULL,說明新節點為第一個節點,則表頭和表尾都為新節點
h=tail=newNode;
}else{
//否則將tail->next指向新節點,並更新表尾
tail->next=newNode;
tail=newNode;
}
}
//返回鏈表第一個節點的指針
returnh;
}
❿ C語言中有關鏈表的基礎知識
舉個例子:假設你想到C的家中拿一樣東西,但你不知道C家的地址,不過,你知道A家的地址,A家有B的地址,B有C的地址,
所以,你到A處找到B的地址,再去B處找到C的地址,就知道C的地址了。鏈表就是這個意思,每一個元素都保存有下一個元素的地址,根據這個地址,你可以依次找到最後一個元素,故形成了一個鏈。
這個代碼,重點就在於結構體,結構體名是:node 其中包含兩個成員變數,一個是 int類型的數據,一個就是 例子中的 「 地址 」,這個 「 地址 」 是一個變數的地址,而這個變數又是你定義的結構體 node 的存儲位置,而這個變數又包含兩個變數(int數據和 「 地址 」 ),這樣就形成了鏈表。
以後你會知道這種 『 地址 』 就是一種變數 叫 指針。