使用函数在链表中添加节点
Adding nodes inside a linked list using a function
我尝试使用 CreateRoom 函数来添加新节点。
每次添加节点时,我都会编辑旧的 "lastRoom.next" 并将其设为当前新节点的地址。
然后我将当前新节点的指针设为新的 "lastRoom"
我认为这是个好主意,我不需要 return 任何东西。我觉得这个不错。
然而,它根本不起作用。
我真的很不擅长编码,我刚学C。有人可以帮忙吗?
struct Room {
int number;
int status;
int luxury;
char occupier[20];
struct Room *next;
};
//I main copy this kind of code from my lecture notes.
//But It's really crappy. This is the only example I can get from the lecture notes
typedef struct Room Room_t;
Room_t *newRoomNode, *ptr, *prev, *temp;
Room_t *firstRoom = NULL, *lastRoom = NULL;
Room_t* CreateRoom(Room_t **first, Room_t **last, int RoomNumber, int type){
Room_t *new = (Room_t *)malloc(sizeof(Room_t));
int *temp;
if (new == NULL)
{
printf("\nMemory was not allocated");
return 0;
}
else
{
//And then I try my way of adding new nodes.
//I don't really understand the example so I make my own
if (*last != NULL)
{
(**last).next = new;
}
new->number = RoomNumber;
new->luxury = type;
new->next = NULL;
*last = new;
if (*first=NULL){
*first=new;
}
}
return 0;
}
void main(){
CreateRoom(&firstRoom, &lastRoom,1,1);
printf("%d",(*firstRoom).number);
}
if (*first=NULL){
*first=new;
}
=
是赋值运算符。您应该使用 ==
进行比较。
你真的不应该为最后一个元素操心。 (如果你需要向后遍历列表,除了next
之外,你还必须有一个prev
成员。)现在,如果你希望CreateRoom()
总是在末尾添加一个新元素在列表中,它应该首先遍历整个列表,直到它到达它的末尾——它因为 NULL 指针而识别——然后将 new
指针分配给它到达的位置:
while (*first != NULL)
first = &(*first)->next;
new->number = RoomNumber;
new->luxury = type;
new->next = *first;
*first = new;
有两点值得注意:
- 赋值
*first = new
不知道 first 是 firstRoom
还是实际元素的 next
成员。
- 可以省略
while
循环以在开头插入新元素,或修改循环以使元素按您想要的方式排序。
我尝试使用 CreateRoom 函数来添加新节点。
每次添加节点时,我都会编辑旧的 "lastRoom.next" 并将其设为当前新节点的地址。
然后我将当前新节点的指针设为新的 "lastRoom"
我认为这是个好主意,我不需要 return 任何东西。我觉得这个不错。
然而,它根本不起作用。
我真的很不擅长编码,我刚学C。有人可以帮忙吗?
struct Room {
int number;
int status;
int luxury;
char occupier[20];
struct Room *next;
};
//I main copy this kind of code from my lecture notes.
//But It's really crappy. This is the only example I can get from the lecture notes
typedef struct Room Room_t;
Room_t *newRoomNode, *ptr, *prev, *temp;
Room_t *firstRoom = NULL, *lastRoom = NULL;
Room_t* CreateRoom(Room_t **first, Room_t **last, int RoomNumber, int type){
Room_t *new = (Room_t *)malloc(sizeof(Room_t));
int *temp;
if (new == NULL)
{
printf("\nMemory was not allocated");
return 0;
}
else
{
//And then I try my way of adding new nodes.
//I don't really understand the example so I make my own
if (*last != NULL)
{
(**last).next = new;
}
new->number = RoomNumber;
new->luxury = type;
new->next = NULL;
*last = new;
if (*first=NULL){
*first=new;
}
}
return 0;
}
void main(){
CreateRoom(&firstRoom, &lastRoom,1,1);
printf("%d",(*firstRoom).number);
}
if (*first=NULL){
*first=new;
}
=
是赋值运算符。您应该使用 ==
进行比较。
你真的不应该为最后一个元素操心。 (如果你需要向后遍历列表,除了next
之外,你还必须有一个prev
成员。)现在,如果你希望CreateRoom()
总是在末尾添加一个新元素在列表中,它应该首先遍历整个列表,直到它到达它的末尾——它因为 NULL 指针而识别——然后将 new
指针分配给它到达的位置:
while (*first != NULL)
first = &(*first)->next;
new->number = RoomNumber;
new->luxury = type;
new->next = *first;
*first = new;
有两点值得注意:
- 赋值
*first = new
不知道 first 是firstRoom
还是实际元素的next
成员。 - 可以省略
while
循环以在开头插入新元素,或修改循环以使元素按您想要的方式排序。