单链表的输入、输出、插入和删除

首先简单的存入一组连续的数据,以 -1 结束
思路:
单链表输入: 申请一个表头的空间 a,并且 a->next 初始为NULL,在表头不存储数据信息,只用来指向链表的头部!(个人认为方便之处在于,判断a->next是否为空即可得知接下来有没有有效信息)用一个临时的指针p,去指向链表的尾部,存储时,申请空间,造出表尾,用原来表尾的next去连接这个新的表尾。
单链表输出: 用循环不断从表头指向表尾,顺便输出元素。不过要注意,初始化p=head->next;

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int data;
    node *nex;
};
void input(node *head)
{
    printf("\nINPUT\n");
    node *p;
    p=head;/*指向表头*/
    int a;
    while(1)
    {
        scanf("%d",&a);
        if(a==-1)
            return ;
        node *q=new node;/*申请一段空间,造出一个表尾*/
        q->data=a;
        q->nex=NULL;
        p->nex=q;/*用来找到表尾*/
        p=q;/*指向新的表尾*/
    }
}
void output(node *head)
{
    node *p;
    p=head->nex;/*这里!!!!*/
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->nex;
    }
    return ;
}
int main()
{
    node *a=new node;/*此处申请空间*/
    a->nex=NULL;/*初始化*/
    input(a);
    output(a);
    node *b=new node;
    b->nex=NULL;
    input(b);
    output(b);
    return 0;
}

单链表的插入和删除
插入: 在 第x位 后面插入y,找到第x个元素即可
删除: 删除第x位 ,所以要找到x-1,和x这两个元素,让(x-1)>next=(x)->next即可,这里面我用了do while()循环实现

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int data;
    node *nex;
};
void input(node *head)
{
    printf("INPUT\n");
    node *p;
    p=head;/*指向表头*/
    int a;
    while(1)
    {
        scanf("%d",&a);
        if(a==-1)
            return ;
        node *q=new node;/*申请一段空间,造出一个表尾*/
        q->data=a;
        q->nex=NULL;
        p->nex=q;/*用来找到表尾*/
        p=q;/*指向新的表尾*/
    }
}
void output(node *head)
{
    node *p;
    p=head->nex;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->nex;
    }
    printf("\n");
    return ;
}
void insert_(node *head,int x,int y)
{
    node *p;
    int i=0;
    p=head->nex;
    while(p!=NULL)
    {
        i++;
        if(i==x)/*遍历链表 ,直到 x这个位置*/
        {
            node *q=new node;
            q->data=y;
            q->nex=p->nex;/*为 y 造出新的空间,并且y的尾部指向x的尾部*/

            p->nex=q;/*x的尾部指向y的头部*/

        }/*穿针引线 ok*/
        p=p->nex;
    } 
    return ;
}
void delate(node *head,int x)
{
    node *p;
    int i=0;
    p=head;
    /*之所以用do while是为了可以删除第一个元素*/
    do
    {
        i++;
        if(i==x)
        {
            node *q=p->nex;/*跳过 因为还没有 执行p=p->nex
            所以p指向的是x-1 , q->nex指向x+1   跳过x即可 */
            p->nex=q->nex;
            free(q);
            break;
        }
        p=p->nex;
    }while(p!=NULL);
    return ;
}
int main()
{
    node *a=new node;/*此处申请空间*/
    a->nex=NULL;/*初始化*/
    input(a);
    output(a);
    int x,y;
    printf("在x为之后插入y,输入x y:\n");
    scanf("%d%d",&x,&y);
    insert_(a,x,y);
    output(a);
    printf("删除第x个元素  输入x:\n");
    scanf("%d",&x);
    delate(a,x);
    output(a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值