[C 常見考題] Linked List Allocation Quiz - 程式扎記

文章推薦指數: 80 %
投票人數:10人

[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++當中有幾個位元運算子:<>SHIFTRIGHT、&AND、... [VerilogTutorial]行為模型的敘述:always,if/else,case與forloop Preface: 在這個階層中,我們只需考慮電路模組的功能,而不需考慮其硬體的詳細內容.Verilog的時序控制為以事件為基礎的時序控制: * 接線或暫存器的值被改變。

* 模組的輸入埠接收到新的值* 正規... [Linux命令]du:顯示目錄或是檔案的大小 屬性: 系統相關-檔案與目錄 語法: du[參數][檔案] 參數|功能 -a|顯示目錄中個別檔案的大小-b|以bytes為單位顯示-c|顯示個別檔案大小與總和-D|顯示符號鏈結的來源檔大小-h|Hum...



請為這篇文章評分?