#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 3
struct student
{
int num;
char name[50];
char sex;
int age;
struct student* next;
};
void input(struct student* stu)
{
struct student* p;
int i=0;
for (p = stu; p < stu + N; p++,i++)
{
printf("第%d位:", i + 1);
scanf("%d %s %c %d", &p->num, p->name, &p->sex, &p->age);
i == N - 1 ? (stu[i].next = NULL) : (stu[i].next = &stu[i + 1]);
}
}
void print(struct student *stu)
{
struct student *p;
for (p = stu; p->next!=NULL; p=p->next);
{
printf("%d %s %c %d", p->num, p->name, p->sex, p->age);
}
}
struct student* del(struct student* stu,int n)
{
struct student* p,*head;
for (p = stu,head=p; p != NULL; p=p->next)
{
if (p->age == n)
{
if (p == head)
{
head = p->next;
}
else if (p->next == NULL)
{
(p - 1)->next = NULL;
}
else
{
(p - 1)->next = p + 1;
}
}
}
return head;
}
int main()
{
int n;
struct student stu[3];
printf("請依次輸入 學號 姓名 性別 年齡:\n");

input(stu);
printf("請輸入一個年齡:\n");
scanf("%d", &n);
print(del(stu,n));
}
這是正常運行的代碼
然后我將del函式中的p=p->next 改為p++后,顯示報錯了。
求助大佬這是為什么啊qaq
uj5u.com熱心網友回復:
代碼被擋了。。我重新發uj5u.com熱心網友回復:
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#define N 3
struct student
{
int num;
char name[50];
char sex;
int age;
struct student* next;
};
void input(struct student* stu)
{
struct student* p;
int i=0;
for (p = stu; p < stu + N; p++,i++)
{
printf("第%d位:", i + 1);
scanf("%d %s %c %d", &p->num, p->name, &p->sex, &p->age);
i == N - 1 ? (stu[i].next = NULL) : (stu[i].next = &stu[i + 1]);
}
}
void print(struct student *stu)
{
struct student *p;
for (p = stu; p->next!=NULL; p=p->next);
{
printf("%d %s %c %d", p->num, p->name, p->sex, p->age);
}
}
struct student* del(struct student* stu,int n)
{
struct student* p,*head;
for (p = stu,head=p; p != NULL;p=p->next)
{
if (p->age == n)
{
if (p == head)
{
head = p->next;
}
else if (p->next == NULL)
{
(p - 1)->next = NULL;
}
else
{
(p - 1)->next = p + 1;
}
}
}
return head;
}
int main()
{
int n;
struct student stu[3];
printf("請依次輸入 學號 姓名 性別 年齡:\n");
input(stu);
printf("請輸入一個年齡:\n");
scanf("%d", &n);
print(del(stu,n));
}
uj5u.com熱心網友回復:
謝邀。其實代碼不用全發出來,只發一點點就足夠了。
首先,你要明白鏈表是怎么回事。想象一下,如果把struct student看成家庭,那么,指標變數p的值指向一個家庭 a,家庭的成員next知道另一個家庭 b。這樣的話,如果變數p一開始指向家庭a,那么,p = p->next就使得變數p指向家庭 b。這里的關鍵是,家庭a和b可能不在一起,相距很遠,位置不確定,但是它們可以通過家庭的成員next彼此建立關聯。
再來看運算式 p ++。如果 p 的型別是 T,那么,p++等價于 p = p + sizeof (T),或者說,p = p + sizeof p。就是說,在p原來的基礎上,再加上p的大小,或者p的型別的大小。顯然,p++的結果是指向p后面的記憶體位置。所以p ++ 要求所有“家庭”必須是連續的、緊鄰的。
uj5u.com熱心網友回復:
簡單來講,就是p指向的是結構,是聚合,不是標量,所以p++非法,后綴運算子++要求運算元是標量uj5u.com熱心網友回復:
更正一下:
后綴運算子++要求運算元是實數型別或是指標型別
結構是聚合型別,所以p++非法
標量還包含了復數型別,而復數型別參與運算子++時,會自動進行實數-復數轉換
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152911.html
標籤:C語言
