带头结点的单链表插入数据
-
什么是头结点
头结点是用来管理链表的结点,这个结点中一般包括常用的管理链表的数据对象,如:指向链表的第一个结点的指针,指向链表最后一个结点的指针,结点个数……
-
代码实现
LLWHinsert.c
#include<stdio.h>
#include<stdlib.h>
#include"LLWHinsert.h"
//先创建一个空的链表,返回头结点
LinkedList *create(void)
{
LinkedList *l = malloc(sizeof(*l));
l->first = NULL;
l->last = NULL;
return l;
}
/*
功能:在带头结点的单链表中插入数据,保证升序
参数:@l:头结点;@p:要插入的结点
*/
void insert(LinkedList *l,Node *p)
{
if(l->first == NULL)
{
l->first = p;
l->last = p;
return;
}
Node *pk = l->first;
Node *pr = NULL;
while(pk)
{
if(pk->data > p->data)
{
break;
}
pr = pk;
pk = pk->next;
}
if(pk == NULL)
{
l->last->next = p;
l->last = p;
}
else
{
if(pk == l->first)
{
p->next = l->first;
l->first = p;
}
else
{
p->next = pk;
pr->next = p;
}
}
}
void printlist(LinkedList *l)
{
if(l == NULL)
{
return;
}
Node *p = l->first;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
LLWHinsert.h
#ifndef __LLWHINSERT_H__
#define __LLWHINSERT_H__
#define element int
typedef struct node
{
element data;
struct node *next;
}Node;
typedef struct LinkedList
{
Node *first;
Node *last;
}LinkedList;
LinkedList *create(void);
void insert(LinkeList *l);
void printlist(LinkedList *l);
#endif
main.c
#include<stdio.h>
#include<stdlib.h>
#include"LLWHinsert.h"
int main()
{
LinkedList *l = create();
int x;
while(1)
{
scanf("%d",&x);
if(x == 0)
{
break;
}
Node *p = malloc(sizeof(*p));
p->data = x;
p->next = NULL;
insert(l,p);
}
printlist(l);
return 0;
}