C语言数据结构-单链表的基本操作(超详细)

发布时间:2024年01月19日

目录:

1.单链表的分类;

2.单链表的操作;

3.代码详解;

4.完整代码展示;

一:单链表的分类

总体上来说,单链表可以分为两大类,一种是带头结点的,另一种是不带头结点的(由于带头结点的链表实用性更强,所以以下讲解和代码均为带头结点的链表);如果分细来讲,链表的插入可以分为两种:头插法和尾插法。

二:单链表的操作

1.单链表的初始化;

2.单链表的头插法;

3.单链表的尾插法;

4.删除元素;

5.遍历链表;

三:代码详解

1.首先应该列出需要用的头文件:

#include<stdio.h>
#include<stdlib.h>  //可以用#include<malloc.h>代替

因为需要分配动态存储空间,所以要用到stdlib函数;

2.定义结构体;

typedef struct Node
{
    int data;
    struct Node *next;
}node; 

3.初始化链表:

node *listcreat()
{
    node *list=(node *)malloc(sizeof(node));
    list->data=0;     //头结点的数据域存储的是该链表中的结点的个数
    list->next=NULL;
    return list;
}

建立一个返回值为node类型的指针函数,定义一个node类型的list指针并分配内存空间,

list的数据域为该链表的结点数,使头结点的next指向空,并返回该头结点的地址。

4头插法增加一个结点:

void addlist(node *list,int data)
{
    node *p=(node *)malloc(sizeof(node));
    p->data=data;
    p->next=list->next;
    list->next=p;
    list->data++;
}

建立一个新的结点p,使p的next指向原来list的next指向的位置,并使list的next指向p,list的data加一。

5.尾插法增加一个结点:

void tailadd(node *list,int data)
{
    node *p=list->next;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    node *q=(node *)malloc(sizeof(node));
    q->data=data;
    q->next=p->next;
    p->next=q;
    list->data++;
}

先使p指向该链表的最后一个结点,增加一个结点,使p的next指向新的结点,list的data加一。

6.删除一个结点:

void deletee(node *list,int n)
{
    int flag=1;
    node *p=list,*q;
    while(p->next!=NULL)
    {
        q=p;
        p=p->next;
        if(n==p->data)
        {
            q->next=p->next;
            free(p);
            list->data--;
            flag=0;
            break;
        }
    }
    if(flag)
    printf("未找到该数据,请重新输入.\n");
}

这一步的难点为while循环中的q指针和p指针的纠缠,总之,q一直指向p的上一个结点,这样就好理解了。

7.遍历链表:

void print(node *list)
{
    node *p=list;
    while(p!=NULL)
    {
        printf("%d->",p->data);
        p=p->next;
    }
    printf("NULL");
}

遍历链表就是输出链表中的所有结点的数据,只需使p指向list然后while循环让p指向链表的下一个节点就OK了。注:输出的第一个数是list->data,也就是链表结点的个数。

8.main函数:

int main()
{
    node *list=listcreat();
    addlist(list,3);
    addlist(list,2);
    addlist(list,1);
    tailadd(list,4);
    tailadd(list,5);
    tailadd(list,6);
    deletee(list,4);
    print(list);
    return 0;
}

main函数中对所有函数功能都检查一遍,确保没有错误。

四:完整代码展示:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
    int data;
    struct Node *next;
}node; 
node *listcreat()
{
    node *list=(node *)malloc(sizeof(node));
    list->data=0;     //头结点的数据域存储的是该链表中的结点的个数
    list->next=NULL;
    return list;
}
void addlist(node *list,int data)
{
    node *p=(node *)malloc(sizeof(node));
    p->data=data;
    p->next=list->next;
    list->next=p;
    list->data++;
}
void tailadd(node *list,int data)
{
    node *p=list->next;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    node *q=(node *)malloc(sizeof(node));
    q->data=data;
    q->next=p->next;
    p->next=q;
    list->data++;
}
void deletee(node *list,int n)
{
    int flag=1;
    node *p=list,*q;
    while(p->next!=NULL)
    {
        q=p;
        p=p->next;
        if(n==p->data)
        {
            q->next=p->next;
            free(p);
            list->data--;
            flag=0;
            break;
        }
    }
    if(flag)
    printf("未找到该数据,请重新输入.\n");
}
void print(node *list)
{
    node *p=list;
    while(p!=NULL)
    {
        printf("%d->",p->data);
        p=p->next;
    }
    printf("NULL");
}
int main()
{
    node *list=listcreat();
    addlist(list,3);
    addlist(list,2);
    addlist(list,1);
    tailadd(list,4);
    tailadd(list,5);
    tailadd(list,6);
    deletee(list,4);
    print(list);
    return 0;
}

*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!

有帮助的话还请点个免费的赞和关注,后面还有数据结构其他部分的讲解,谢谢大家。

文章来源:https://blog.csdn.net/2301_79975618/article/details/135660172
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。