簡體   English   中英

C雙鏈表程序

[英]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 ,該函數甚至沒有將其正確鏈接到列表中(暫時忽略未初始化的變量),因此不會添加任何新節點。

然后,指定ts ,從而初始化s但是有一個不確定的值 ,因此沒有什么變化。

然后,您將繼續為t調用釋放內存(即使您尚未分配任何內存),並且此時s == t與釋放s相同。 指針分配僅復制指針,而不復制其指向的內存。

該代碼可能還有許多其他問題,但我到此為止。 我建議您從頭開始,並以更簡單的方式來學習指針和動態內存分配的工作方式。 然后回到這個問題,但是在編寫任何代碼之前,請嘗試在紙上畫圖。 例如,一個空列表應該是什么樣? 添加第一個節點后的外觀如何? 在第二個和第三個節點之后? 如果將節點添加到列表的末尾,效果如何? 到列表的開頭? 一旦一切都清楚了,就可以開始編寫代碼了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM