12.6 单循环链表的创建(几处细节的改动)

发布于 2024-12-06  74 次阅读


首先,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;
	}
}
届ける言葉を今は育ててる
最后更新于 2024-12-10