无头结点的链表顺序插入
按照大小顺序插入时需要记录插入位置前面一个节点的指针,因此使用两个指针对链表进行遍历,另外,用函数对无头链表进行插入等操作,要用一个指针来进行而且输入要使用指针的地址,否则返回之后找不到链表的头了
typedef struct listnode *list;
struct listnode
{
int data;
list next;
};
int insert(int n, list *q) {
list temp = (list)malloc(sizeof(struct listnode));
temp->data = n;
temp->next = NULL;
list current; //记录前面的指针
list previous=NULL;
current = *q;
while (current != NULL && current->data < n) { //找到比n大的结点,把n插在前面 找到或者current==NULL
previous = current;
current = current->next;
}
temp->next = current;
if (previous == NULL) *q=temp;
else previous->next = temp;
return true;
}
另外还可以用指针保存链表结点指针的地址,用两个指针指向同一个结点,结点保存后就可以对它把它当成previous->next来操作
int insert2(int n, list *q) {
list temp = (list)malloc(sizeof(struct listnode));
temp->data = n;
temp->next = NULL;
list current;
while ((current = *q) != NULL && current->data < n) q = ¤t->next; //*q为头指针
//q指向的值为next,current已经更新为current->next了,但q本身仍然是current的next这个位置,相当于&previous->next,他没有被重新赋值
temp->next = current;
*q = temp; //上一个current的next
return true;
}
这儿需要理解一个问题,current->next指向的是current下一个的位置,但不一定是下一个节点,这个指针可以重新指向其他位置