数据结构——链表

1、单链表

由若干节点组成,单链表的结点只有一个指针域

单链表的结点结构

(1)结构体的创建

typedef struct node

{

    int data;

    struct node *next; 

} Node,*Link;

头指针:指向第一个结点的地址

尾标志:终端结点的指针域为空

(2)遍历操作

void display(Link head)

{

    Link p=head->next;

    while(p!=NULL)

    {

        printf("%d",p->data);

        p=p->next;                   // 不能使用p++

    }

}

注:p->next 指的是下一个结点的全部,包括下一节点的data和next

(3)求元素个数

伪代码

代码:

int length(Link head)

{

    Link p = head->next;

    int count = 0;

    while (p != NULL)

    {

        p = p->next;

        count++;

    }

    return count;

}

(4)查找元素

int search(Link head, int x)

{

    Link p = head->next;

    while (p != NULL)

    {

        if (p->data == x)

        {

            printf("%d", x);

            return 1;

        }

        p = p->next;

    }

    return 0;

}

(5)插入操作

伪代码:

int insert(Link head,int i, int x)

{

    Link p = head->next;

    int count =0;

    while (p!=NULL&&count<i-1)

    {

        p=p->next;

        count++;

    }

    if(p==NULL)

        return 0;

    else{

        Link node = (Link)malloc(sizeof(Link));

        node->data = x;

        node->next = p->next;

        p->next = node;

        return 1;

    }  

}

(6)创建单链表

①头插法

数组顺序和插入顺序是相反的

Link create(int a[], int n)

{

    Link head = (Link)malloc(sizeof(Link));

    head->next = NULL;

    for (int i = 0; i < n; i++)

    {

        Link node = (Link)malloc(sizeof(Link));

        node->data = a[i];

        node->next = head->next;

        head->next = node;

    }

    return head;

}

②尾插法

数组顺序和插入顺序相同

Link create(int a[], int n)

{

    Link head = (Link)malloc(sizeof(Link));

    head->next = NULL;

    Link rear = head;

    for (int i = 0; i < n; i++)

    {

        Link node = (Link)malloc(sizeof(Link));

        node->data = a[i];

        rear->next = node;

        rear = node;

    }

    rear->next = NULL;

    return head;

}

注:最后一个元素一定要设为空。(关键)

(7)删除结点

伪代码:

代码

int delete(Link head, int x)

{

    if (head == NULL || head->next == NULL)

        return 0;

    Link p = head->next;

    Link q = head;

    while (p != NULL)

    {

        if (p->data == x)

        {

            q->next = p->next;

            free(p);

            return 1;

        }

        else

        {

            q = p;

            p = p->next;

        }

    }

    return 0;

}

2、循环链表

各项操作与单链表相同

3、双向链表

可以快速求得结点的前驱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值