鏈表c語言單向
① c語言單向鏈表的問題
上面這位老兄叢配胡有點遺漏,我補充一下:
1、pr=p=(struct
node*)malloc(sizeof(struct
node));
這行的pr指針為什麼要再指向p呢,我想是想像我下面更改後的代碼里if塊裡面要執行的第二條語句,實際上兩種寫法的執行效果截然不同!
去掉pr=,因為它只是一個偏移指針,不需要真實分配內存給它。在下面的語句中,它是隨著結點的插入而移動的!當鏈表插入第一個後pr必須指向head指向的內存塊。
2、代碼編寫有誤導致無法連接下面的結點,一下代碼缺少括弧:
f(head==NULL)
/*判斷是否為第一個結點*/
head=p;
/*使指向第一個結點*/
else
pr->next=p;
/*連接結點*/
pr=p;
//應該加上括弧,否則你上面的else代碼只會執行第一句,而pr=p卻總是無用地被執行。
if(head==NULL)
/賣銷*判斷是否為第一個結點*/
{
head=p;
/*使指向第一個結點*/
pr
=
p;
//pr
指針也應該指向開頭的第一個結點。
}
else
{
pr->next=p;
/*連接結點*/
pr=p;
//插入第二個結點後,pr指向第二個結點,插入第三個結點時,pr指向第三個結點,類推.....
}
建議出這樣的錯誤的時候使用調試工具單步調試。細小的錯誤就會露滲攔出馬腳來了!
② C語言 單向鏈表的頭結點問題
1.頭結點是單向鏈表的第塌祥一個結點,一般設一個指向頭結點的指針,團碧搏頭結點一般存放鏈表的長度信息,如果有其他需要也可以存放其他信息,看你的需求了。
2.如果你的鏈表第一個結點沒有慧襪存放鏈表信息而是存放了實際的數據,那麼就是說你的鏈表是不帶頭結點的鏈表
實際上帶不帶頭結點的鏈表都是可以使用的,看你的喜好了。呵呵!
③ 用C語言編程(創建一個單向鏈表)
*creat a list*/
#include "stdlib.h"
#include "stdio.h"
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please input 5 numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4) ptr->next=NULL;
else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一個簡單的創建鏈表的C程序。所謂鏈表形象的講就是一個數據塊裡面存有數頃派絕據,並且存有下一個數據的指針,這樣一個雀姿指一個形成一個數據鏈。這個數據鏈可以被操作,例如插入數據,刪除數據,等。至於指令,首先定義一個結構體,它存有數據和羨返指向下一個數據塊的指針。然後分配空間。注意最後一個為NULL,當然你也可以指向開頭一個數據塊形成一個循環鏈表
④ C語言單向鏈表問題。
printf(「->%d」,p->data)這是模輪是字元串而已。
比如:p->data的值為14。那麼執行printf(「->%d」,p->data)後,賣碼慎顯示:->14。
比如:這個p鏈表數據為:中敬1,2,3,4,那麼執行完這個循環後,顯示為:->1->2->3->4
這樣是為了顯示好看罷了。
⑤ C語言中如何實獲取單向鏈表的頭指針
首先你的問題有點小小的誤解,頭指針意思為指向鏈表頭結點的一個指針,你必須自己定義一個鏈表結點類型的指針,並指向那個鏈表的頭結點就可以了~何來獲取一說,因為本身就是你自己定義的~。
你的問題應該是如何獲取單項鏈表的頭結點。常見的解決方案共有以下幾種:
1.聲明鏈表後,馬上定義一個頭指針,指向鏈表的頭結點,這樣,不管程序運行到哪兒,都可以通過訪問頭指針來得到頭結點。
2.定義單獨的頭結點,不賦槐念值,永遠只作為類似標志的性質,以後通過它訪問整個鏈表鉛拍困,即鏈表第一個結點為頭結點->Next。
3.將賀塌單向鏈表製作為循環鏈表,在頭結點設置特殊值,永遠往一個方向找,一旦找到特殊值,即為找到頭結點。
⑥ C語言單向鏈表
用指針鏈表主要是靈活,不受元素個數限制,用數組可以達到同樣的效果,在結構成員里加一個指向下一個元素的下標變數就行,缺點是元素數量不能超過數組定源基義的最大長度,除非數組也是動態分配空間納型,每次重新分配空間時,還要將原來數組里的內容復制到到新分配的數組中,並且從數組雹茄謹中刪除一個元素時,會出現碎片,如果想利用這些碎片,每次都得遍歷一遍數組,用指針鏈表刪除一個元素就簡單多了。
⑦ C語言數據結構 如何建立單向循環鏈表並且輸入值
#include<iostream>
usingnamespacestd;
typedefcharElemType;
typedefintStatus;
#defineOK1
#defineERROR0
typedefstructLnode
{
ElemTypedata;
structLnode*next;
}Lnode,*LinkList;
voidCreat_List(LinkListL)//創建單鏈表並輸入元素
{
LinkListp,q;
q=L;
charch;
cout<<"請輸入鏈表元素,並且以輸入#表示結束!"<<endl;
while(cin>>ch&&ch!='#')
{
p=newLnode[sizeof(Lnode)];
if(!p)
{
cout<<"獲取內存失敗"<<endl;
exit(ERROR);
}
p->data=ch;//尾插法
L->next=p;
L=p;
}
L->next=q;
}
voidoutput_List(LinkListL)//遍歷單鏈表(輸出單鏈表元素)
{
LinkListp;
p=L->next;
if(p==L)
{
cout<<"該鏈表是空鏈表!"<<endl;
exit(ERROR);
}
while(p!=L)
{
cout<<p->data<<"";
p=p->next;
}
}
Statusmain()
{
LinkListH;
H=(LinkList)malloc(sizeof(Lnode));
H->next=NULL;//設置頭結點為空
Creat_List(H);
output_List(H);
return0;
}//頭結點有和沒有都是可以的,頭結點只是為了讓操作鏈表更方便,
⑧ C語言 單向鏈表如何排序
void link_order(STU *p_head)
{
STU *pb, *pf, temp;
pf = p_head;
if(p_head == NULL) {//鏈表為空
printf("needn't order. ");
return ;
}
if(p_head->next == NULL) {//鏈表有1個節點
printf("only one print, needn't order. ");
return ;
}
while(pf->next != NULL) {//以pf指向的節點為基準節點
pb = pf->next;//pb從基準點的下一個節點開始
while(pb != NULL) {
if(pf->num > pb->num) {
temp = *pf;
*pf = *pb;
*pb = temp;
temp.next = pf->next;
pf->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;
}
pf = pf->next;
}
return ;
}
(8)鏈表c語言單向擴展閱讀:
鏈表的排序有三種情況:
1、鏈表為空時:不用排序;
2、鏈表中有一個節點:不用排序;
3、鏈表中兩個及其以上節點時:排序。
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數執行的一種方式。當return語句提供了一個值時,這個值就成為函數的返回值。
return語句用來結束循環,或返回一個函數的值。
1、return 0,說明程序正常退出,返回到主程序繼續往下執行。
2、return 1,說明程序異常退出,返回主調函數來處理,繼續往下執行。return 0或return 1對程序執行的順序沒有影響,只是大家習慣於使用return(0)退出子程序而已。
⑨ c語言單向鏈表
name 保存在結構體單元的name[20] 數組里;
typedef struct node
{
char name[20];
struct node *link;
}stud;
這是你前面定義的結構體變數,一個單元包含兩個部分,一個用來存儲name的數組name[20],一個用來存放下一個單元地址的指向結構體node的指針。
假設該單元的地址是p,那麼p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一個單元的地址。
--------------》你看不懂的部分如下《-----------------
p->link=s; /*把s的地址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連接起來了*/
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name); /*在當前結點s的數據域中存儲姓名*/
s->link=NULL;
p=s;
}
在這段代碼前面是分配一個結構體單元空間,s是這個新分配空間的地址,p是鏈表的尾節點的地址,以鏈表形式說,新分配的應當跟在它後面。
按上面所講,p->link用來存放下一單元的地址,因此有:
p->link=s; 這樣新節點就成為鏈表的一部分了。
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name);
這兩句,是對將需要輸入的名字讀入並且存放在新節點用於存放name 的數組中。
此時,剛開辟的新節點成了尾節點,尾節點不指向任何其它節點,因此s->link=NULL;(NULL是空指針)
(C中處理指針需要小心行事)
p=s; 將p變數賦值為s,即讓其為尾節點的地址,便於繼續添加節點。