//使用头结点的好处:1.插入删除等函数不需要额外考虑位于首结点的条件。2.一些改变链表的函数在传参时,如不改变头结点,可只传递普通
//头结点的指针,否则的话,需要传递首结点指针的指针来应对更改首结点地址的情况。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node//结点的存储结构
{
int data; //
struct Node *next;
}Node, *LinkList; //Node为结点结构的数据类型,*LinkList为头指针
LinkList LinkCreat();
void LinkAddHead(LinkList L, int val);
void LinkAddTail(LinkList L, int val);
void LinkInsert(LinkList L, int val, int index);
void LinkDelete(LinkList L, int index);
void LinkTravel(LinkList L);
int main()
{
LinkList L = LinkCreat();
LinkAddHead(L, 1);
LinkTravel(L);
LinkAddTail(L, 2);
LinkInsert(L, 3, 3);
LinkTravel(L);
LinkDelete(L, 2);
LinkTravel(L);
getchar();
getchar();
getchar();
}
LinkList LinkCreat()//链表创建
{
LinkList L = (LinkList)malloc(sizeof(Node));
L->next = NULL;
L->data = -1;
return L;
}
void LinkAddHead(LinkList L, int val)//从链表头插入
{
LinkList p = (LinkList)malloc(sizeof(Node));
p->data = val;
p->next = L->next;
L->next = p;
}
void LinkAddTail(LinkList L, int val)//从链表尾插入
{
LinkList p = (LinkList)malloc(sizeof(Node));
LinkList q = L;
p->data = val;
while (q->next)
{
q = q->next;
}
q->next = p;
p->next = NULL;
}
void LinkInsert(LinkList L, int val, int index)//从指定结点处插入
{
LinkList p = (LinkList)malloc(sizeof(Node));
p->data = val;
LinkList q = L;
int i = 1;
while (q->next && i < index)
{
i++;
q = q->next;
}
p->next = q->next;
q->next = p;
}
void LinkDelete(LinkList L, int index)//删除结点
{
int i = 1;
LinkList p ,q = L;
while (q->next && i < index)
{
i++;
q = q->next;
}
p = q->next;
q->next = p->next;
free(p);
}
void LinkTravel(LinkList L) //链表遍历
{
LinkList p = L->next;
while (p)
{
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}