C语言 在编写链表是时候出现了这样的问题 求解

include

include

include

typedef struct student
{
char name[1];
float score[1];
struct student next;
}STU;
STU *myCreatelist(STU *head)
{
STU *q,*p;
char temp[10];
int flag=1;
float t=0;
head=(STU
)malloc(sizeof(STU));
head->next=NULL;
q=head;
while(flag)
{
p=(STU*)malloc(sizeof (STU));
p->next=NULL;
printf("input name\n");
scanf("%s",temp);
printf("input score\n");
strcpy(p->name,temp);
scanf("%f",&t);
p->score[0]=t;
q->next=p;
q=p;
printf("inpuut flag\n");
scanf("%d",&flag);
}
p=head->next;
while(p)
{
printf("name is :%s\n",p->name);
printf("score is :%.2f\n",p->score[0]);
p=p->next;
}
printf("\n");
return head;
}
void main ()
{
STU *head,*p,*q;
head=myCreatelist(head);
q=head->next;
while (q=q->next)
{
if(!strcmp (q->next->name,"x6"))
{
p=q->next;
q->next=p;
break;
}
}
p=head;
while (p=p->next)
{
printf("name is :%s\n",p->name);
printf("score is :%f\n",p->score[0]);
p=p->next;
}
}
图片说明

main() 當中的這句話 會產生衝突

head=myCreatelist(head);

因為你把 head 指針傳入含數 myCreatelist 當中 然後去接受 malloc 產生的記憶體位址. 這時你的 head 指針運行到上面這行 拆分成兩部分

myCreatelist(head); <== 會讓你取得 malloc() 的內存指針. 然而當你 加上 head = 在函數前頭時. head 又被改變成 ,myCreatelist() 含數指針.

所以把 maim() 當中的這行 head=myCreatelist(head); 改成 myCreatelist(head); 即可 !

這樣一來編譯不會錯誤, 若是只有警告, 也不會因為運行了 head=myCreatelist(head); 造成錯亂.

head=myCreatelist(head);

指標不是這樣使用的 !!

通常指標回傳有兩個方法, (1) 從參數裡頭傳入, 在函數內操作完畢, 即可取得指標內容. (2) 使用 return 來回傳 head.
同一指標不能同時又放入參數列, 在含數內操作, 然後又從 return 當中獲得. 這是不合法的.

你有兩個選擇,

(1) 使用參數傳入指標 myCreatelist(head); <== 傳入指標 head, 但是不用 return.
在 myCreatelist(head) 含數內操作
head = malloc(xxx);

(2) 使用含數呼叫並使用 return 取得.
head=myCreatelist(); <== 不傳參數進去. 此時的 head 為 global variable.

兩種都可以達成你想要的目的 !

含數本身 也是一種內存指針位置. 所以如果你呼叫了某個含數 前面再用等號去承接該函數. 如果該函數沒有回傳值. 變成等號前面的變數 成接了該函數的內存指針如下:

func 本身不 return 任何值, func() 在內存位置 0x00011 位置, 此時, a = func(b), a 不會等於 10, 而是會等於含數本身內存位址 0x00100.

0x00001 int a;
0x00010 int b = 3;
0x00011 void func(*aa) { *aa = *aa + 7; }
0x00100 a = func( b );
0x00101

语法上就没有错了,不过逻辑上错了

==> 那是因為你拿到了指針指向內存的位址, 而不是運算後的結果, 編譯器無法幫你解決邏輯錯誤 !