带头链表:固定一个节点作为头结点,起一个标志位的作用,以后不管链表节点如何改变,此头结点固定不变.
不带头链表:头结点不固定,根据实际需要变换头结点
链表基本操作
//链表基本操作
typedef struct _LINKNODE
{
int id;//数据域
struct _LINKNODE* next;//指针域
}link_node;
typedef struct _LINKNODE
{
int data;
struct _LINKNODE* next;
}link_node;
link_node* init_linklist()
{
//创建头结点
link_node* head = NULL;
//给头结点分配内存
head = (link_node*)malloc(sizeof(link_node));
if (head == NULL)
{
return NULL;
}
head->data = -1;
head->next = NULL;
//保存当前节点
link_node* p_current = head;
int data = -1;
//循环向链表中插入节点
while (1)
{
printf("please input data:\n");
scanf("%d", &data);
//如果输入-1,则退出循环
if (data == -1)
{
break;
}
//给新节点分配内存
link_node* newnode = (link_node*)malloc(sizeof(link_node));
if (newnode == NULL)
{
break;
}
//给结点赋值
newnode->data = data;
newnode->next = NULL;
//新结点入链表,也就是将节点插入到最后一个结点的下一个位置
p_current->next = newnode;
//更新辅助指针p_current
p_current = newnode;
}
return head;
}
遍历链表
void foreach_linklist(link_node* head)
{
if (head == NULL)
{
return;
}
//赋值指针变量
Link_node* p_current = head->next;
while (p_current != NULL)
{
printf("%d", p_current->data);
p_current = p_current->next;
}
}
void insert_linklist(link_node* head, int val, int data)
{
if (head == NULL)
{
return;
}
//两个辅助指针
link_node* p_prev = head;
link_node* p_current = p_prev->next;
while (p_current != NULL)
{
if (p_current->data == val)
{
break;
}
p_prev = p_current;
p_current = p_prev->next;
}
//如果p_current 为空,说明不存在值为val的节点
if (p_current == NULL) {
printf("不存在值为%d的节点!\n", val);
return;
}
//创建新的节点
link_node* newnode = (link_node*)malloc(siezeof(link_node));
newnode->data = data;
newnode->next = NULL;
//新节点入链表
newnode->next = p_current;
p_prev->next = newnode;
}
void remove_linklist(link_node* head, int val)
{
if (head == NULL)
{
return;
}
//辅助指针
link_node* p_prev = head;
link_node* p_current = p_prev->next;
//查找值为val的节点
while (p_current != NULL) {
if (p_current->data == val)
{
break;
}
p_prev = p_current;
p_current = p_prev->next;
}
//如果p_current为空,表示没有找到
if (p_current == NULL) {
return;
}
//删除当前节点,重新建立待删除节点的前驱后继节点关系
p_prev->next = p_current->next;
//释放待删除节点的内存
free(p_current);
}
//销毁链表
void destory_linklist(link_node* head)
{
if (head == NULL)
{
return;
}
//赋值指针
link_node* p_current = head;
while (p_current != NULL)
{
//缓存当前节点下一个节点
link_node* p_next = p_current->next;
free(p_current);
p_current = p_next;
}
}