数据结构复习——线性表的链式存储实现(单向链表)

上一篇讲了顺序存储,现在是实现另一种形式:链式存储。

除了做了单向链表,还有双向链表,十字链表。

先贴上最基础的单向链表。实现增删遍历,其余的操作都是大同小异。

#include<bits/stdc++.h>
using namespace std;
typedef struct Node * Nodeptr;
typedef struct Node
{
    int data;               //数据
    struct Node * next;     //指针
} NODE;                     //NODE等价于struct Node,Nodeptr等价于struct Node *
Nodeptr createLinklist()//创建
{
    int n,value;                                  //记录创建节点的个数和值
    Nodeptr Head=(Nodeptr)malloc(sizeof(Nodeptr));//创建头指针
    if(Head==NULL)                                //判断失败操作
    {
        printf("分配内存失败!\n");
        exit(-1);
    }
    Head->next=NULL;                              //分配成功后初始化值
    Nodeptr p=Head;                               //指针p始终指向表尾


    printf("输入创建节点的个数:");
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&value);
        Nodeptr NewNode=(Nodeptr)malloc(sizeof(NODE));
        if(NewNode==NULL)
        {
            printf("分配内存失败!\n");
            exit(-1);
        }
        NewNode->data=value;      //值放入
        NewNode->next=NULL;        //末尾为空,两步标配的初始化操作
        p->next=NewNode;           //指向新节点
        p=NewNode;                 //仍然让p指向末尾
    }
    return Head;
}


void traverseLinklist(Nodeptr Head)//遍历
{
    Nodeptr p=Head->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    return ;
}


void insertElement(Nodeptr Head,int pos, int value)//插入
{
    //将值为value的元素插入到pos位置
    int i=0;
    Nodeptr p=Head;
    while(p!=NULL&&i<pos-1)//将指针定位到第pos-1个节点,其中可能位置不存在
    {
        p=p->next;
        i++;
    }
    if(p==NULL||i>pos-1)
    {
        printf("位置不存在!\n");
        return ;
    }
    Nodeptr NewNode=(Nodeptr)malloc(sizeof(Node));//分配内存
    if(NewNode==NULL)
    {
        printf("分配内存失败!\n");
        exit(-1);
    }
    NewNode->data=value;               //赋值
    NewNode->next=NULL;                //初始化


    Nodeptr q=p->next;              //指向下一个节点
    p->next=NewNode;                   //插入该节点
    NewNode->next=q;                   //插入该节点
    return ;
}


void deleteElement(Nodeptr Head,int pos)//删除
{
    //删除同上
    int i=0;
    Nodeptr p=Head;
    while(p!=NULL&&i<pos-1)
    {
        p=p->next;
        i++;
    }
    if(p->next==NULL||i>pos-1)
    {
        printf("位置不存在!\n");
        return ;
    }
    Nodeptr q=p->next;
    p->next=p->next->next;
    free(q);
    q=NULL;
    return ;
}
int main()
{
    Nodeptr head=NULL;
    head=createLinklist();
    traverseLinklist(head);
    insertElement(head,4,10);
    traverseLinklist(head);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值