链表是一种常见的基础数据结构,结构体指针,下面用c语言实现单链表插入,删除,打印等基本操作
1.头插法
- 头插法:从一个空表开始,重复读入数据,生成新节点,将读入的数据域存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直至读入结束为止
头插法图解
头插法代码
//插入元素(头插法)
int insertheadList(node_t **head, int value)
{
node_t *new_node;
new_node = malloc(sizeof(node_t));
memset(new_node, 0, sizeof(*new_node));
memset(new_node, 0, sizeof(node_t));
new_node->next = NULL; //将最后一个结点的指针域永远保持为NULL
new_node->data = value;
//带头结点
new_node->next = (*head)->next;//将头指针所指向的下一个结点的地址,赋给新创建结点的next
(*head)->next = new_node; //将新创建的结点的地址赋给头指针的下一个结点
//不带头结点
/*new_node->next = *head;
*head = new_node;*/
printf("insertLastList函数执行,向表头元素成功\n");
return 1;
}
2.尾插法
将新结点插入到当前单链表的表尾上
尾插法图解
尾插法代码
//插入元素(尾插法)
int insertLastList(node_t **head, int value)
{
node_t *new_node;//new_node用来指向新生成的节点
node_t *tail;//tail用来指向终端节点
tail = *head;//tail指向了头节点,此时的头节点是终端节点
new_node = malloc(sizeof(node_t));
//memset(new_node, 0, sizeof(*new_node) );
memset(new_node, 0, sizeof(node_t));
new_node->next = NULL;
new_node->data = value;
if (*head == NULL)//判断是否为第一个节点
{
*head = new_node;
}
else
{
while (tail->next != NULL)//当链表不为空时tail向后移动
{
tail = tail->next;
}
tail->next = new_node;//用tail来接纳新节点
}
tail = new_node;//tail指向终端节点
new_node->next = NULL;//元素已经全部装入链表中,终端节点指针域为NULL
printf("insertLastList函数执行,向表尾插入元素成功\n");
return 1;
}
3.删除元素
删除链表元素图解
删除元素代码
//删除元素
node_t *deleteList(node_t **head, int value) //删除结点
{
node_t *p, *q;
p = *head;
while (p->next != NULL)
{
if (p->next->data == value)
{
q = p->next;
p->next = q->next;
free(q);
q = NULL;
}
else
p = p->next;
}
}
4.打印元素
遍历链表代码
//打印链表
void printList(node_t *head)
{
if (NULL == head) //链表为空
{
printf("PrintList函数执行,链表为空\n");
}
else
{
while (NULL != head)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
}
主函数
/* ----- End of main() ----- */
int main(int argc, char **argv)
{
node_t *node = NULL;
int num;
insertLastList(&node, 11);
printList(node);
insertLastList(&node, 12);
printList(node);
insertLastList(&node, 13);
printList(node);
scanf("%d", &num);
deleteList(&node, num);
insertheadList(&node, 14);
printList(node);
return 0;
}
总结
头指针:是链表必要的,有标识作用,指向链表的第一个结点,如果链表有头结点,指向链表的头结点,无论链表是否为空,头指针都不为空
头结点:不是链表必要的,使用头结点是为了简插入和删除的操作,让第一个结点和其他结点操作一致,头结点的数据域一般不存放东西,如果放的话通常也是链表的长度