【数据结构】单链表的实现及其相关操作C/C++

本文将重点讲述单链表的创建以及相关操作的实现。其实在理解链表并不是什么困难的事情,很多人说指针很难,主要是被链表当中的指针的相关操作给难住了。在编写代码的时候需要指针的相关知识。建议大家先熟悉之前学过的指针的相关知识,这样再去理解链表就会变得轻松许多。
这里是一个讲解单链表的视频:https://www.bilibili.com/video/BV1Rb411F738?t=2521
希望大家可以实际编写相关代码,有助于更好的理解。下面是相关代码的展示:

#include<cstdio>
#include<cstdlib>

typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList L;
int length;

#define OK 1
#define ERROR 0;

int initList(LinkList &L,int &a);                           //初始化顺序表
int insertElem(LinkList &L,int &a,int b,int c);             //插入数据
int deleteElem(LinkList &L,int a);                          //删除数据
int getElem(LinkList L,int a,int &e);                       //查找指定位置数据
int findElem(LinkList L,int e,int &a);                      //按值查找数据
void Input(LinkList &L,int &a,int b);                       //输入
void Output(LinkList L);                                    //输出
int destroyList(LinkList &L);                               //销毁

int main(void)
{
    int flag = 1;
    int do_it;
    int number;
    int position;
    int insert_elem;
    int get_elem;
    int elem;
    int find_position;

    while (flag)
    {
        printf("**********菜单栏**********\n");
        printf("1.初始化\n");
        printf("2.输入\n");
        printf("3.插入数据\n");
        printf("4.删除数据\n");
        printf("5.指定位置查找数据\n");
        printf("6.按值查找数据\n");
        printf("7.输出\n");
        printf("8.销毁\n");
        printf("9.退出\n");
        printf("**********菜单栏**********\n");
        printf("请输入要执行的功能:");
        scanf("%d",&do_it);
        if (do_it < 1 || do_it >9)
        {
            printf("输入错误,请重新输入!\n");
        }
        else
        {
            switch (do_it)
            {
            case 1:
                if(initList(L,length))
                {
                    printf("初始化成功!表长为:%d\n",length);
                }
                else
                {
                    printf("初始化失败!\n");
                }
                break;
            
            case 2:
                printf("请输入要插入的数据数量:");
                scanf("%d",&number);
                Input(L,length,number);
                break;

            case 3:
                printf("请输入要插入数据的位置:");
                scanf("%d",&position);
                printf("请输入要插入的数据:");
                scanf("%d",&insert_elem);
                if(insertElem(L,length,position,insert_elem))
                {
                    printf("插入成功!表长为:%d\n",length);
                }
                else
                {
                    printf("插入失败!\n");
                }
                break;
            
            case 4:
                printf("请输入要删除数据的位置:");
                scanf("%d",&position);
                if(deleteElem(L,position))
                {
                    printf("删除成功!表长为:%d\n",length);
                }
                else
                {
                    printf("删除失败!\n");
                }
                break;
            
            case 5:
                printf("请输入要查找数据的位置:");
                scanf("%d",&position);
                if(getElem(L,position,get_elem))
                {
                    printf("取值成功!数据为:%d\n",get_elem);
                }
                else
                {
                    printf("取值失败!\n");
                }
                break;
            
            case 6:
                printf("请输入要查找的数据:");
                scanf("%d",&elem);
                if(findElem(L,elem,find_position))
                {
                    printf("查找成功!所在位置为:%d\n",find_position);
                }
                else
                {
                    printf("查找失败!\n");
                }
                break;

            case 7:
                Output(L);
                break;

            case 8:
            {
                if(destroyList(L))
                {
                    printf("链表已销毁!\n");
                }
            }

            case 9:
                flag = 0;
                break;
            }

        }
    }
    return 0;
}

int initList(LinkList &L,int &a)
{
    L = (LNode *)malloc(sizeof(LNode));
    L->next = NULL;
    a = 0;
    return OK;
}

void Input(LinkList &L,int &a,int b)
{
    LNode *p;
    a = b;
    printf("请倒序输入数据!\n");
    for(int i = 0;i < b;i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
    printf("表长为:%d\n",b);
}

void Output(LinkList L)
{
    LNode *p;
    p = L->next;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

int destroyList(LinkList &L)
{
    free(L);
    return OK;
}

int insertElem(LinkList &L,int &a,int b,int c)
{
    LNode *p;
    LNode *s;
    int j = 0;
    p = (LNode *)malloc(sizeof(LNode));
    p = L;
    while(p && (j < b - 1))
    {
        p = p->next;
        j++;
    }
    if(!p || (j > b-1))
    {
        return ERROR;
    }
    else
    {
      s = (LNode *)malloc(sizeof(LNode));  
      s->data = c;
      s->next = p->next;
      p->next = s;
      length++;
      return OK;
    }
}

int deleteElem(LinkList &L,int a)
{
    LNode *p;
    LNode *q;
    int j = 0;
    p = L;
    while((p->next) && (j < a-1))
    {
        p = p->next;
        j++;
    }
    if(!(p->next) || j > a-1)
    {
        return ERROR;
    }
    else
    {
        q = p->next;
        p->next = q->next;
        free(q);
        length--;
        return OK;
    }
}

int getElem(LinkList L,int a,int &e)
{
    LNode *p;
    int j = 1;
    p = L->next;
    while (p && j < a)
    {
        p = p->next;
        j++;
    }
     if(!p || j > a)
    {
        return ERROR;
    }
    else
    {
        e = p->data;
        return OK;
    }
}

int findElem(LinkList L,int e,int &a)
{
    LNode *p;
    int j = 1;
    p = L->next;
    for(int i = 1;i < length;i++)
    {
        p = p->next;
        j++;
        if(p == NULL)
        {
            return ERROR;
        }
        if(p->data == e)
        {
            a = j;
            return OK;
        }
    }
    return 0;
}

代码中的注意事项大家可以参考严蔚敏版的数据结构,里面有很详细的讲解。需要注意的一点是这里由于用到了C++中的函数引用,源文件在命名时采用的时“.cpp”而不是“.c”。其他的语法基本与C语言相同。

如果您有什么见解和疑问,欢迎私信我或者联系我的邮箱:1308269670@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值