带头结点的单链表
特点:
①头结点定义在栈区,不保存数据,起标记作用,不参与具体运算。
②其他数据结点在堆区,动态申请内存/
带头结点的单链表结构体声明
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList;
具体实现如下:
(1)初始化:头结点本身已存在,只需将头的next置为NULL
void InitLinkList(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
plist->next = NULL;
}
(2)求链表长度
int Listlength(LinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return -1;
}
plist->data=0;
LinkList p = plist->next;
while(p!=NULL)
{
plist->data++;
p=p->next;
}
return plist->data;
}
(3)求结点位置,返回该结点
LinkList GetNode(LinkList plist, int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return NULL;
}
if(pos<0) //判断pos是否合法
{
return NULL;
}
LinkList p=plist;
while(pos!=0 && p!=NULL)
{
p=p->next;
pos--;
}
return p;
}
(4)静态函数:申请新节点(避免了调用函数是进栈出栈,速度快很多)
static LinkList NodeApply(LinkList next, int val)
{
LinkList q=(Node *)malloc(sizeof(Node));
assert(q != NULL);
if(q == NULL)
{
return NULL;
}
q->data=val;
q->next = next; //先连后面
return q;
}
(5)插入
void Insert(LinkList plist,int