注:此篇是我使用指標敲的一些題目的整合,有一些**是重複的(撓頭)。這樣做的目的是進行前後的一些比較和收穫一些心得(?)。
題目:輸入十個整數,進行排序。
做法1:(傳遞指標p)
#include #include #include using namespace std;
void swap(int *p)
} }for(i = 1; i <= 10; i++)
printf("\n");
}int main()
swap(p);
return 0;
}
做法2:(傳遞陣列名)
#include #include #include using namespace std;
void swap(int a)
} }for(i = 1; i <= 10; i++)
printf("\n");
}int main()
swap(a);
return 0;
}
有段時間沒敲鍊錶了(撓頭),重新實現下,發現還是很多地方出錯了:(經過漫長時間的debug,發現乙個原因是,在主函式裡面定義的整形變數,在函式pdelete裡面缺少了對其的定義,編譯居然過了(撓頭)
寫了兩遍。貼個最後一次實現的**吧。
鍊錶的建立,輸出,插入和刪除
#include #include #include using namespace std;
struct node
;void ininode(node *head)
head -> next = null;
head -> data = -1;
}node *creat()
p1 = (node *)malloc(sizeof(node));
if(p1 == null)
p1 -> data = a;
p2 -> next = p1;
p2 = p1; }
return head;
}void output(node *head)
printf("\n");
}void pinsert(node *head)
node *p;
p = (node *)malloc(sizeof(node));
if(p == null)
p -> next = p1;
p -> data = i_data;
p2 -> next = p;
output(head);
}void pdelete(node *head)
p1 = p1 -> next;
free(p2 -> next); // 勿忘我
p2 -> next = p1;
output(head);
}int main()
void ininode(node *head)
head -> next = null;
head -> data = -1;
}node *creat()
p1 = (node *)malloc(sizeof(node));
if(p1 == null)
p1 -> data = a;
p2 -> next = p1;
p2 = p1; }
return head;
}
**1. **在creat裡面,初始化node的時候不能置null:
node *head = null; // error.
ininode(head);
**2. **其次,在構建鍊錶的時候,需要注意p2 始終跟在 p1的後面,起到link的作用。
p1 = (node *)malloc(sizeof(node));
···p1 -> data = a;
p2 -> next = p1; // 這句話不要忘記
p2 = p1;
**3. **while迴圈條件,我的寫法是剛剛開始時將p1 和p2 ,指向頭節點。所以迴圈條件得:
while(p1 -> next != null || p1 == head)
否則,開始時p1 -> next == null
就沒有辦法進入迴圈進行輸入。
void output(node *head)
printf("\n");
}
注意:按照我的寫法,開始賦值的時候,需要置p為head -> next
,否則無法進入迴圈。
void pinsert(node *head)
node *p;
p = (node *)malloc(sizeof(node));
if(p == null)
p -> next = p1;
p -> data = i_data;
p2 -> next = p;
output(head);
}
**1. **for迴圈條件需要根據p1 和 p2的初始指向確定。
p1 = p2 = head;
···for(i = 1; i <= num; i++) // <=
否則會導致崩潰,指向錯誤。
**2. **創立的新結點 同樣需要malloc
語句
node *p;
p = (node *)malloc(sizeof(node));
if(p == null)
void pdelete(node *head)
p1 = p1 -> next;
free(p2 -> next); // 勿忘我
p2 -> next = p1;
output(head);
}
注:和insert一樣,需要根據p1 和p2 的初始指向確定迴圈範圍。
void pfree(node *head)
if(p1 == head)
free(p1);
}
c指標的一些理解
c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。右左...
關於C指標的一些理解
有時總被指標的用法及型別所困擾,那我簡單理解一下指標。指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。如下例子 1 int ptr 2 cha...
C 使用指標的一些情境
關於指標的基本概念網路上有很多,這裡列的是一些細節,加深理解。為正在學習c c 的人提供。一 指標概念的核心 指標 儲存的是另乙個物件的位址。string s hello world string p s 指標 p 指向的是 string 型別的物件 s,即指標 p 儲存 s 的位址 瞎寫 0xss...