[英]C Doubly Linked List Program
我一直在編寫一個C語言程序來處理雙鏈表。 但這在Dev Cpp上不起作用。 有人可以指出任何錯誤嗎? 直到我添加新記錄的那一部分崩潰為止。 我猜想scanf()函數有問題。
//C double-linked list program
struct stu {
int roll,ph,ch,ma;
stu *plink,*nlink;
};
void addstu(stu *p,stu *n) { //add
stu *s;
int roll,ph,ch,ma;
printf("HELLO STUDENT!\nYour roll no.? ");
scanf("%d",&roll);
printf("\nPhysics score? ");
scanf("%d",&ph);
printf("\nChemistry? ");
scanf("%d",&ch);
printf("\nMath? ");
scanf("%d",&ma);
s->roll=roll;
s->ph=ph;
s->ch=ch;
s->ma=ma;
s->plink=p;
s->nlink=n;
}
void remstu(stu *s) { //remove
stu *next;
next->plink=s->nlink;
free(s);
}
// Main function
int main() {
stu *s;
int choice=0, ct=0;
while(choice!=4) {
printf("\n\t\tWELCOME TO RECORDS\n\n1. ADD\n2. REMOVE\n3. SEE\n4. EXIT\nEnter your choice(1-4): ");
scanf("%d",&choice);
switch(choice) {
case 1:
stu *t;
addstu(s,t);
s=t;
free(t);
++ct;
break;
case 2:
remstu(s);
break;
case 3:
for(int i=0;i<ct;++i) {
printf("\n\nRoll no. %d\nPhysics %d\nChemistry %d\nMath %d",s->roll,s->ch,s->ph,s->ma);
s=s->plink;
}
break;
case 4:
exit(0);
break;
default:
printf("Please enter correct choice(1-4)!");
}
}
return 0;
}
s->roll=roll;
函數addstu()
的指針s
永遠不會初始化,對其取消引用會導致未定義的行為,從而導致崩潰。
做
s = malloc(sizeof(struct stu)); /* Allocate memory */
我希望你有
typedef struct stu stu;
閱讀代碼后,您將發生許多未定義的行為。
讓我們以case 1
為例:
stu *t;
addstu(s,t);
s=t;
free(t);
++ct;
第一個問題是,當您調用addstu
,變量s
未初始化。 未初始化的(非靜態)局部變量具有不確定的值 ,並且在實踐中似乎是隨機的。 變量t
同樣如此。 因此,在addstu
時,您會將節點鏈接設置為未初始化的指針。
您調用addstu
,它應該創建一個新節點,並添加到列表中。 但是應該創建的那個節點會發生什么呢? 沒什么,它沒有從addstu
函數傳遞addstu
,該函數甚至沒有將其正確鏈接到列表中(暫時忽略未初始化的變量),因此不會添加任何新節點。
然后,指定t
到s
,從而初始化s
但是有一個不確定的值 ,因此沒有什么變化。
然后,您將繼續為t
調用釋放內存(即使您尚未分配任何內存),並且此時s == t
與釋放s
相同。 指針分配僅復制指針,而不復制其指向的內存。
該代碼可能還有許多其他問題,但我到此為止。 我建議您從頭開始,並以更簡單的方式來學習指針和動態內存分配的工作方式。 然后回到這個問題,但是在編寫任何代碼之前,請嘗試在紙上畫圖。 例如,一個空列表應該是什么樣? 添加第一個節點后的外觀如何? 在第二個和第三個節點之后? 如果將節點添加到列表的末尾,效果如何? 到列表的開頭? 一旦一切都清楚了,就可以開始編寫代碼了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.