首先,create这个函数是不需要改变的(不想create也传入一维指针,太多的head会让人感到很烦)
node* create(int data) {
node* newnode = malloc(sizeof(node));
newnode->data = data;
newnode->next = NULL;
return newnode;
}
//这些代码不变
insert函数要改动很多
void insert(node** head, int data) {
node* newnode = create(data);
if (*head == NULL) {
*head = newnode;
newnode->next = *head;//增加1
}
else {
node* temp = *head;//这个不管是不是循环链表都要有
while (temp->next != *head) {//改动1
temp = temp->next;
}
temp->next = newnode;//让传入的数据成为最后的节点
newnode->next = *head;//增加2
}
}
我能不能把newnode->next = *head这个代码提到if-else语句的前面?
答案是没有任何必要!
首先,最初的时候我们更新"head"为newnode,而你最前面就赋予了newnode->next = *head
那么"head"指向的就是NULL,而不是"head"自己!(NULL是最初head的初始化值)
那么你仍然需要增加1添加newnode->next = *head;的代码
if (*head == NULL) {
*head = newnode;
newnode->next = *head;//增加1,逃不掉的
}
虽然else里面不用加了,但是并没有让这个代码变得简单,所以没有必要把这个代码放前
需要注意的是show函数的temp也必须要有(如果还是只用head的话,head变了就没法中止循环了,又不是非循环链表可以用NULL中止)
void show(node* head) {
node* temp = head;//这个必须要有
while (1) {
printf("%d", temp->data);
if (temp->next == head) {//改动NULL为head即可
break;
}
temp = temp->next;
}
}
Comments NOTHING