从 C 中不兼容的指针类型赋值
assignement from incompatible pointer type in C
我有一个结构的链表,
这是我的结构:
typedef struct avion
{
int code;
int capacite;
char etat[1];
int date;
int nvols;
} avion;
typedef struct element *list;
typedef struct element
{
avion A;
struct element *svt;
} element;
我想按照结构“capacite”的元素升序排列链表。
这是函数 tri 的代码:
list *tri(list *L)
{
list *i,*j,*min;
avion x;
for (i=L; (*i)->svt != NULL; i=(*i)->svt)
{
min=i;
for (j=(*i)->svt; j != NULL; j=(*j)->svt)
{
if ((*j)->A.capacite < (*min)->A.capacite)
min=j;
}
if (min != i)
{
x=(*min)->A;
(*min)->A = (*i)->A;
(*i)->A = x;
}
}
return(L);
}
但我收到警告:来自不兼容指针的赋值(在 for 循环的两行中:我不知道如何修复它。
有没有更好的方法根据这个标准对我的链表进行排序?
例如在这个for循环中
for (i=L; (*i)->svt != NULL; i=(*i)->svt)
变量i
声明为
list *i
具有类型 struct element **
。另一方面,数据成员 svt
的类型为 struct element *
。因此这个作业
i=(*i)->svt
包含不同类型的操作数,并且没有从类型 struct element *
到类型 struct element **
的隐式转换。
请注意,如果由于此表达式而为空列表调用该函数,则该函数可能会调用未定义的行为
(*i)->svt != NULL;
还有一个单元素数组的声明
char etat[1];
没有什么意义。
并为这样的指针引入这样的别名
typedef struct element *list;
总的来说不是一个好主意。只会让代码的读者迷惑。
不需要通过指向它的指针将指向头节点的指针传递给函数tri
(实现选择排序),因为指针本身在函数内没有改变.
函数可以按照下面的演示程序所示的方式声明和定义。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct avion
{
int capacite;
} avion;
typedef struct element list;
typedef struct element
{
avion A;
struct element *svt;
} element;
int push_front( list **head, int capacite )
{
element *new_element = malloc( sizeof( element ) );
int success = new_element != NULL;
if ( success )
{
new_element->A.capacite = capacite;
new_element->svt = *head;
*head = new_element;
}
return success;
}
void display( const list *head )
{
for ( ; head != NULL; head = head->svt )
{
printf( "%d -> ", head->A.capacite );
}
puts( "null" );
}
void tri( list *head )
{
for ( ; head != NULL; head = head->svt )
{
element *min = head;
for ( element *current = head->svt; current != NULL; current = current->svt )
{
if ( current->A.capacite < min->A.capacite )
{
min = current;
}
}
if ( min != head )
{
avion tmp = min->A;
min->A = head->A;
head->A = tmp;
}
}
}
int main(void)
{
enum { N = 10 };
list *head = NULL;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < N; i++ )
{
push_front( &head, rand() % N );
}
display( head );
tri( head );
display( head );
return 0;
}
程序输出可能如下所示。
7 -> 1 -> 2 -> 6 -> 0 -> 9 -> 0 -> 9 -> 6 -> 0 -> null
0 -> 0 -> 0 -> 1 -> 2 -> 6 -> 6 -> 7 -> 9 -> 9 -> null
如果使用名称的别名定义 list
则该函数看起来就像该演示程序中所示。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct avion
{
int capacite;
} avion;
typedef struct element *list;
typedef struct element
{
avion A;
struct element *svt;
} element;
int push_front( list *head, int capacite )
{
element *new_element = malloc( sizeof( element ) );
int success = new_element != NULL;
if ( success )
{
new_element->A.capacite = capacite;
new_element->svt = *head;
*head = new_element;
}
return success;
}
void display( list head )
{
for ( ; head != NULL; head = head->svt )
{
printf( "%d -> ", head->A.capacite );
}
puts( "null" );
}
void tri( list head )
{
for ( ; head != NULL; head = head->svt )
{
element *min = head;
for ( element *current = head->svt; current != NULL; current = current->svt )
{
if ( current->A.capacite < min->A.capacite )
{
min = current;
}
}
if ( min != head )
{
avion tmp = min->A;
min->A = head->A;
head->A = tmp;
}
}
}
int main(void)
{
enum { N = 10 };
list head = NULL;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < N; i++ )
{
push_front( &head, rand() % N );
}
display( head );
tri( head );
display( head );
return 0;
}
因为这个
typedef 结构元素 *列表;
当你写
列表 *i
i 不是元素上的指针,而是元素指针上的指针
我有一个结构的链表, 这是我的结构:
typedef struct avion
{
int code;
int capacite;
char etat[1];
int date;
int nvols;
} avion;
typedef struct element *list;
typedef struct element
{
avion A;
struct element *svt;
} element;
我想按照结构“capacite”的元素升序排列链表。 这是函数 tri 的代码:
list *tri(list *L)
{
list *i,*j,*min;
avion x;
for (i=L; (*i)->svt != NULL; i=(*i)->svt)
{
min=i;
for (j=(*i)->svt; j != NULL; j=(*j)->svt)
{
if ((*j)->A.capacite < (*min)->A.capacite)
min=j;
}
if (min != i)
{
x=(*min)->A;
(*min)->A = (*i)->A;
(*i)->A = x;
}
}
return(L);
}
但我收到警告:来自不兼容指针的赋值(在 for 循环的两行中:我不知道如何修复它。
有没有更好的方法根据这个标准对我的链表进行排序?
例如在这个for循环中
for (i=L; (*i)->svt != NULL; i=(*i)->svt)
变量i
声明为
list *i
具有类型 struct element **
。另一方面,数据成员 svt
的类型为 struct element *
。因此这个作业
i=(*i)->svt
包含不同类型的操作数,并且没有从类型 struct element *
到类型 struct element **
的隐式转换。
请注意,如果由于此表达式而为空列表调用该函数,则该函数可能会调用未定义的行为
(*i)->svt != NULL;
还有一个单元素数组的声明
char etat[1];
没有什么意义。
并为这样的指针引入这样的别名
typedef struct element *list;
总的来说不是一个好主意。只会让代码的读者迷惑。
不需要通过指向它的指针将指向头节点的指针传递给函数tri
(实现选择排序),因为指针本身在函数内没有改变.
函数可以按照下面的演示程序所示的方式声明和定义。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct avion
{
int capacite;
} avion;
typedef struct element list;
typedef struct element
{
avion A;
struct element *svt;
} element;
int push_front( list **head, int capacite )
{
element *new_element = malloc( sizeof( element ) );
int success = new_element != NULL;
if ( success )
{
new_element->A.capacite = capacite;
new_element->svt = *head;
*head = new_element;
}
return success;
}
void display( const list *head )
{
for ( ; head != NULL; head = head->svt )
{
printf( "%d -> ", head->A.capacite );
}
puts( "null" );
}
void tri( list *head )
{
for ( ; head != NULL; head = head->svt )
{
element *min = head;
for ( element *current = head->svt; current != NULL; current = current->svt )
{
if ( current->A.capacite < min->A.capacite )
{
min = current;
}
}
if ( min != head )
{
avion tmp = min->A;
min->A = head->A;
head->A = tmp;
}
}
}
int main(void)
{
enum { N = 10 };
list *head = NULL;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < N; i++ )
{
push_front( &head, rand() % N );
}
display( head );
tri( head );
display( head );
return 0;
}
程序输出可能如下所示。
7 -> 1 -> 2 -> 6 -> 0 -> 9 -> 0 -> 9 -> 6 -> 0 -> null
0 -> 0 -> 0 -> 1 -> 2 -> 6 -> 6 -> 7 -> 9 -> 9 -> null
如果使用名称的别名定义 list
则该函数看起来就像该演示程序中所示。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct avion
{
int capacite;
} avion;
typedef struct element *list;
typedef struct element
{
avion A;
struct element *svt;
} element;
int push_front( list *head, int capacite )
{
element *new_element = malloc( sizeof( element ) );
int success = new_element != NULL;
if ( success )
{
new_element->A.capacite = capacite;
new_element->svt = *head;
*head = new_element;
}
return success;
}
void display( list head )
{
for ( ; head != NULL; head = head->svt )
{
printf( "%d -> ", head->A.capacite );
}
puts( "null" );
}
void tri( list head )
{
for ( ; head != NULL; head = head->svt )
{
element *min = head;
for ( element *current = head->svt; current != NULL; current = current->svt )
{
if ( current->A.capacite < min->A.capacite )
{
min = current;
}
}
if ( min != head )
{
avion tmp = min->A;
min->A = head->A;
head->A = tmp;
}
}
}
int main(void)
{
enum { N = 10 };
list head = NULL;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < N; i++ )
{
push_front( &head, rand() % N );
}
display( head );
tri( head );
display( head );
return 0;
}
因为这个 typedef 结构元素 *列表; 当你写 列表 *i i 不是元素上的指针,而是元素指针上的指针