血墨
2017-10-15 06:08
采纳率: 66.7%
浏览 792
已采纳

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;
}
}
图片说明

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • Saeba 2017-10-15 12:58
    已采纳

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

    head=myCreatelist(head);

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

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

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

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • Saeba 2017-10-15 07:09

    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.

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

    评论
    解决 无用
    打赏 举报
  • Saeba 2017-10-15 13:06

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

    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

    评论
    解决 无用
    打赏 举报
  • Saeba 2017-10-15 13:08

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

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题