[C 常見考題] Linked List Allocation Quiz - 程式扎記
文章推薦指數: 80 %
[C 常見考題] Linked List Allocation Quiz · PL createLL2() · { · PL head = NULL; · printf("\t[Info] Create LinkedList...\n"); · PPL lastref = &head; ...
標籤
[英文學習]
[計算機概論]
[深入雲計算]
[雜七雜八]
[AlgorithminJava]
[DataStructureswithJava]
[IRClass]
[Java文章收集]
[Java代碼範本]
[Java套件]
[JVM應用]
[LFDNote]
[MangoDB]
[MathCC]
[MongoDB]
[MySQL小學堂]
[Python考題]
[Python常見問題]
[Python範例代碼]
[心得扎記]
[網路教學]
[C常見考題]
[C範例代碼]
[C/C++範例代碼]
[IntroAlg]
[Java代碼範本]
[Java套件]
[Linux小技巧]
[Linux小學堂]
[Linux命令]
[MLInAction]
[ML]
[MLP]
[Postgres]
[Python學習筆記]
[QuickPython]
[SoftwareEngineering]
[Thepythontutorial]
工具收集
設計模式
資料結構
ActiveMQInAction
AI
Algorithm
Android
Ansible
AWS
BigData研究
C/C++
C++
CCDH
CI/CD
Coursera
Database
DB
DesignPattern
DeviceDriverProgramming
Docker
Docker工具
DockerPractice
Eclipse
EnglishWriting
ExtJS3.x
FP
FraudPrevention
FreeBSD
GCC
Git
GitPro
GNU
Golang
Gradle
Groovy
Hadoop
Hadoop.HadoopEcosystem
Java
JavaFramework
JavaUI
JavaIDE
JavaScript
Jenkins
JFreeChart
Kaggle
Kali/Metasploit
Keras
KVM
LearnSpark
LeetCode
Linux
Lucene
Math
ML
MLUdemy
MPI
Nachos
Network
NLP
nodejs
OO
OpenCL
OpenMP
OSC
OSGi
Pandas
Perl
PostgreSQL
PyDS
Python
Python自製工具
PythonStdLibrary
Pythontools
QEMU
R
RealPython
RIA
RTC
Ruby
RubyPackages
Scala
ScalaIA
SQLAlchemy
TensorFlow
Tools
UML
Unix
Verilog
Vmware
Windows技巧
wxPython
2013年3月12日星期二
[C常見考題]LinkedListAllocationQuiz
Preface:
基本上C的Pointer常常會讓程式員頭痛不已(debug到天荒地老,昏天暗地...),因此它也成為常見的考題.底下會以 LinkedList 當作背景,然後使用Pointer的Pointer進行LinkedList的Allocation.聽起來饒舌,解釋起來更饒舌...Orz.
Question:
首先假設你有一個struct結構如下:
viewplaincopytoclipboardprint?
structLinkedList{
int data;
structLinkedList*next;
};
typedefstructLinkedListL;
typedefstructLinkedList*PL;
typedefstructLinkedList**PPL;
常見的LinkedList的Allocation方法會如下:
viewplaincopytoclipboardprint?
PLcreateLL()
{
printf("\t[Info]CreateLinkedList...\n");
PLhead=NULL,rear=NULL;
int i;
for(i=0;i<6;i++)
{
PLnewNode=malloc(sizeof(L));
if(newNode==NULL)
{
printf("\t[Info]Memoryerror!\n");
return NULL;
}
newNode->data=i;
newNode->next=NULL;
if(rear==NULL)
{
head=rear=newNode;
}
else
{
rear->next=newNode;
rear=newNode;
}
}
return head;
}
上面代碼會建立下面的LinkedList:
接著問題來了,題目要求你使用Pointer的Pointer(PPL)改寫LinkedList的Allocation.
PossibleSol:
底下是使用PPL改寫上面LinkedList的Allocation的其中一個寫法:
viewplaincopytoclipboardprint?
PLcreateLL2()
{
PLhead=NULL;
printf("\t[Info]CreateLinkedList...\n");
PPLlastref=&head;
int i;
for(i=0;i<6;i++)
{
*lastref=malloc(sizeof(L));
(*lastref)->data=i;
(*lastref)->next=NULL;
lastref=&((*lastref)->next);
}
return head;
}
接著我們要一行行來解釋上述代碼的運作.
1. 使用PPL指向head的記憶體位置:
2. MemoryallocationforstructLinkedList:
3. 移到LinkedList當前node的下一個位置上(方便下一個loop的allocation)
4. 繼續steps2~3直到forloop結束.(所以下一次為變數 *lastref 分配記憶體位置會指定到變數 next 上面去!)
CompleteCodeRef:
由上面的問題可以看出使用PPL的代碼簡潔多,但是容易寫錯:p(寫起來漂亮;維護起來痛苦?).底下為完整代碼,其中函數 createLL() 是舊有的LinkedListallocation;而函數 createLL2() 則是使用Pointer的Pointer改寫的代碼:
viewplaincopytoclipboardprint?
#include
#include
structLinkedList{
int data;
structLinkedList*next;
};
typedefstructLinkedListL;
typedefstructLinkedList*PL;
typedefstructLinkedList**PPL;
PLcreateLL()
{
printf("\t[Info]CreateLinkedList...\n");
PLhead=NULL,rear=NULL;
int i;
for(i=0;i<6;i++)
{
PLtemp=malloc(sizeof(L));
if(temp==NULL)
{
printf("\t[Info]Memoryerror!\n");
return NULL;
}
temp->data=i;
temp->next=NULL;
if(rear==NULL)
{
head=rear=temp;
}
else
{
rear->next=temp;
rear=temp;
}
}
return head;
}
PLcreateLL2()
{
PLhead=NULL;
printf("\t[Info]CreateLinkedList...\n");
PPLlastref=&head;
int i;
for(i=0;i<6;i++)
{
*lastref=malloc(sizeof(L));
(*lastref)->data=i;
(*lastref)->next=NULL;
lastref=&((*lastref)->next);
}
//printf("\t[Test]head->data=%d\n",head->data);
return head;
}
void showLinkedList(PLhead)
{
printf("\t[Info]ShowLinkedList...\n");
PLtemp=head;
while(temp!=NULL)
{
printf("%d",temp->data);
temp=temp->next;
}
printf("\n");
}
void delLinkedList(PLhead)
{
printf("\t[Info]FreeLinkedList...\n");
PLtemp=head;
while(temp!=NULL)
{
temp=head->next;
free(head);
head=temp;
}
}
int main()
{
PLhead=NULL;
head=createLL2();
if(head==NULL)
{
printf("\t[Error]Fail!\n");
return 0;
}
showLinkedList(head);
delLinkedList(head);
return 0;
}
執行結果如下:
[Info]CreateLinkedList...[Info]ShowLinkedList...012345[Info]FreeLinkedList...
於
3月12,2013
以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest
標籤:
[C常見考題]
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言(Atom)
[Python常見問題]HowcanIgettheIPaddressfromNICinPython?
Sourcefrom hereQuestionSohowcanIgettheIPaddressofspecificnetworkinterfaceinPython?HowToMethod#1 (useexternalpacka...
[C文章收集]BitwiseOperation
轉載自 這裡 前言: 歡迎來到二進位的世界。
電腦資料都是以二進位儲存,想當然程式語言的變數也都是以二進位儲存。
在C/C++當中有幾個位元運算子:<
* 模組的輸入埠接收到新的值* 正規...
[Linux命令]du:顯示目錄或是檔案的大小
屬性: 系統相關-檔案與目錄 語法: du[參數][檔案] 參數|功能 -a|顯示目錄中個別檔案的大小-b|以bytes為單位顯示-c|顯示個別檔案大小與總和-D|顯示符號鏈結的來源檔大小-h|Hum...
延伸文章資訊
- 1筆試面試題總結之單鏈表(Linked List) - 台部落
題目中一般涉及到的鏈表均爲單鏈表,因此總結的大部分操作也是以單鏈表爲主。 此總結爲刷完LeetCode中標籤爲Linked List的題之後寫的,所以涉及的操作和 ...
- 2[Day10] 30 天挑戰演算法- 兩個LinkedList 之和 - iT 邦幫忙
題目來源:Add Two Number. 問題: 給予兩個linked lists, 並且在linked list 裡的所有元素都是正數(沒有負數)而且都是個位數,請試著將兩個linked li...
- 3Linked List 的反轉操作– 陪你刷題
在做linked list 相關題目時,不論是recursive 還是iterative 寫法,寫起來都相當燒腦,因此決定以自己好理解的方式,整理一篇跟linked list 反轉操作 ...
- 4linked list c面試的測驗範本和範例,1111、DCARD
提供c面試考題指標相關PTT/Dcard文章,想要了解更多有關健康/醫療文章或書籍, ... 萊禮- 透視C語言指標(之前有大略翻過,在面試時重新精讀) Leetcode的Linked List...
- 5聯發科c考題、鏈結串列題目在PTT/mobile01評價與討論
linked list c考題在PTT/mobile01評價與討論, 提供聯發科c考題、鏈結串列題目、單向鏈結串列c就來健身資訊懶人包,有最完整linked list c考題體驗分享 ...