头结点单链表

//使用头结点的好处: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");
    
}
 

猜你喜欢

转载自blog.csdn.net/weixin_41951281/article/details/85994184