new_node->next=NULL; struct node* i=head;
时间: 2023-04-02 22:01:22 浏览: 66
这是一段 C 语言代码,其中定义了一个指向结构体 node 的指针 new_node,并将其 next 成员赋值为 NULL。接着定义了一个指向结构体 node 的指针 i,并将其赋值为指向头结点的指针 head。
相关问题
HeadNode->next = NULL;
`HeadNode->next = NULL;` 是链表初始化的一种方式,它的作用是将链表的头节点的 next 指针指向 NULL,表示链表为空链表。
在使用链表时,我们通常会定义一个头节点(也称为哨兵节点),它不存储任何数据,只作为链表的起始位置,方便链表的操作。当链表为空时,头节点的 next 指针指向 NULL。
下面是一个简单的链表结构体定义,其中定义了头节点:
```c++
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
struct LinkedList {
ListNode *head; // 头节点
// 构造函数,初始化头节点
LinkedList() {
head = new ListNode(0);
head->next = NULL;
}
// 在链表头部插入节点
void insert(int val) {
ListNode *newNode = new ListNode(val);
newNode->next = head->next;
head->next = newNode;
}
// 输出链表节点值
void print() {
ListNode *cur = head->next;
while (cur) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
};
```
在 LinkedList 的构造函数中,我们初始化了头节点,并将头节点的 next 指针指向 NULL。这样,当我们创建一个空链表时,头节点的 next 指针就指向 NULL,表示链表为空。在 insert 函数中,我们通过表头插入法在链表头部插入节点,因为头节点的 next 指针一开始指向 NULL,所以第一次插入的节点就成为了链表的第一个节点。在 print 函数中,我们从头节点的 next 指针开始遍历链表,输出每个节点的值。
优化以下代码 int ItemDB_AddItem(const struct Item *p_item) /*把p_item指向的物品加入数据库中*/ //成功则返回1,否则返回0 { struct Item_Node *p,*p_new; p_new=(struct Item_Node *)malloc(sizeof(struct Item)); p=item_database_head; if(item_database_head==NULL) { item_database_head=p_new; p_new=p_item; p_new->next=NULL; } if(item_database_head!=NULL) { while(p->next!=NULL) { p=p->next; } p->next=p_new; p_new=p_item; p_new->next=NULL; } ++num_items; return 1; }
以下是优化后的代码:
int ItemDB_AddItem(const struct Item *p_item) {
struct Item_Node *p_new = (struct Item_Node *)malloc(sizeof(struct Item_Node));
if (p_new == NULL) {
return 0;
}
p_new->item = *p_item;
p_new->next = NULL;
if (item_database_head == NULL) {
item_database_head = p_new;
} else {
struct Item_Node *p = item_database_head;
while (p->next != NULL) {
p = p->next;
}
p->next = p_new;
}
++num_items;
return 1;
}
主要的改进有:
1. 将申请内存和初始化节点合并到一起,减少了一次节点初始化的操作。
2. 对于内存申请失败的情况进行了处理,避免了悬挂指针的问题。
3. 将 p_new = p_item 和 p_new->next = NULL 的赋值语句交换了顺序,使得代码的逻辑更加清晰。
4. 在遍历链表时,使用了一个指针 p,而不是直接使用头节点 item_database_head,这样可以避免修改头指针的问题。
5. 去掉了 if(item_database_head!=NULL) 这个无用的判断。