单链表

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE,HEAD,*PNODE,*LINKLIST;

//初始化链表
void init(LINKLIST *list)
{
    *list = (LINKLIST)malloc(sizeof(HEAD));
    (*list)->next=NULL;
}

//向链表添加数据
void add(LINKLIST list,int data)
{
    PNODE p = list ,q;
    if(!p)
        return;
    //将p指向list的最后一个
    while(p->next)
        p=p->next;
    q = (PNODE)malloc(sizeof(NODE));
    q->data = data;
    q->next = NULL;
    p->next = q;
}

//第i个位置 插入数据    i>=1
void insert(LINKLIST list,int i,int data)
{
    int j;
    PNODE p=list,q;
    //将 p 指向 list的第 i-1 个位置
    for(j=1;j<i && p;j++)
    {
        p = p->next;
    }
    if(!p || i<1)
        return ;
    q = (PNODE) malloc(sizeof(NODE));
    q->data =data;
    q->next = p->next;
    p->next = q;
}

//删除第i个位置的数据  i>=1,并将删除的数据保存在data中
void del(LINKLIST list,int i,int *data)
{
    int j;
    PNODE p=list,q;
    //将 p 指向 list的第 i-1 个位置
    for(j=1;j<i && p;j++)
    {
        p = p->next;
    }
    if(!p || i<1)
        return ;
    q = p->next;//q为要删除的节点
    *data = q->data;
    p->next = q->next;
    free(q);
}

//清除list
void clear(LINKLIST list)
{
    PNODE p=list,q=p->next;
    if(!p)
        return;
    while(p=q)
    {
        q=p->next;
        free(p);
    }
    list->next=NULL;
}

//销毁list
void destroy(LINKLIST list)
{
    PNODE p=list,q;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

//获取list中的第i个元素 i>=1
int getData(LINKLIST list,int i)
{
    PNODE p=list;
    assert(i>=1 && p);//为p断言,防止list不存在或者i的位置不合法
    while(i-- && p)
        p=p->next;
    assert(p);//为p和i断言,防止位置i不在list的范围内
    return p->data;
}

//获取链表的长度
int getLen(LINKLIST list)
{
    PNODE p=list;
    int i=0;
    if(!p)
        return i;
    while(p->next)
    {
        i++;
        p=p->next;
    }
    return i;
}

//显示
void display(LINKLIST list)
{
    PNODE p=list;
    if(!p)
        return ;
    while(p= p->next)
        printf("%d ",p->data);
    printf("
");
}

int main()
{
    int i;
    LINKLIST list;
    init(&list);
    for(i=1;i<=10;i++)
        add(list,i);

    display(list);
    printf("%d
",getData(list,1));
    destroy(list);//销毁
    system("pause");
    return 0;
}

总结:

插入操作:

1,将指针P指向插入位置前一个。

2,insertNode->next = P->next。

3,P->next = insertNode

删除操作:

1,将指针P指向删除节点delNode的前一个

2,delNode = p->next

3,p->next = delNode->next

4,free(delNode)

原文地址:https://www.cnblogs.com/dzqdzq/p/3366585.html