数据结构——单链表的基本操作

本文介绍了链表的创建、输出、插入、删除和冒泡排序等基本操作,并通过实例展示了如何实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

struct node
{
    int data;
    struct node * next;
};
typedef struct node Node;
//创建链表函数
Node *Creat()
{
    Node *h=NULL,*p1,*p2;
    cout<<"Input integer to create a list,0 to end:"<<endl;
    p1=(Node *) malloc(sizeof(Node));    //给第一个节点分配内存
    cout<<"请输入第一个数"<<endl;
    cin>>p1->data;
    if(p1->data!=0)
        h=p1;
    while(p1->data!=0)    //以0结束输入
    {
        p2=p1;
        p1=(Node *) malloc(sizeof(Node));
        cin>>p1->data;
        p2->next=p1;
    }
    if(h!=NULL)
        p2->next=NULL;    //h==NULL时链表是空的,p2还没有指向任何对象,故不存在next域
    return h;
}//end creat
//打印输出函数
void PrintList(Node *h)
{
    if(h==NULL)
        cout<<"List is empty!"<<endl;
    else
    {
        while(h!=NULL)
        {
            cout<<h->data<<"  ";
            h=h->next;
        }
        cout<<"NULL"<<endl;
    }
}//end printlist
//插入函数
Node * insert(Node *h,int value)
{
    Node *previous,*current,*newp;
    previous=NULL;
    current=h;
    while(current!=NULL && current->data<value)
    {
        previous=current;
        current=current->next;
    }
    newp=(Node *)malloc(sizeof(Node));
    newp->data=value;
    newp->next=current;

    if(previous==NULL)    //插在表头,当链表是空时,或者第一个元素就大于要插入的元素时。
    {
        h=newp;
    }
    else
        previous->next=newp;
    
    return h;
}//end insert
//删除元素函数
Node * delet(Node *h, int value)
{
    Node *previous,*current;
    Node *temp;        //临时保存要删除的节点,然后指针重新连接后再释放该节点的内存
    if(value==h->data)    //删除头结点
        {
            temp=h;
            h=h->next;
            free(temp);
        }
    else
    {
        previous=h;
        current=h->next;
        while(current!=NULL && current->data!=value)
        {
            previous=current;
            current=current->next;
        }
        if(current!=NULL)
        {
            temp=current;
            previous->next=current->next;
            free(temp);
        }
        else
            cout<<"node is not found!"<<endl;
    }
    return h;
}//end delet()

//冒泡排序链表
Node * bubblesort(Node *head)
{ 
        Node *p1, *p2; //用于排序
     Node *lastExchangePtr; //冒泡排序法的主线
     //遍历链表,使得p1指向链表的最后一个结点,从而为下面冒泡法的循环做准备
     for(p1=head; p1->next!=NULL; p1=p1->next);
     for(; p1!=head; p1=lastExchangePtr)    //p1向前递减
     {
         lastExchangePtr = head; //防止内循环没有执行以致lastExchangePtr没有改变从而导致死循环
         for(p2=head; p2!=p1; p2=p2->next)
         {
              if(p2->data > p2->next->data)
              {
                   swap(p2->data, p2->next->data);    //结点本身的位置并不交换,而只交换两个结点之间的数据,从而使问题得到了简化
                   lastExchangePtr = p2;
              }
         }
     }
     return head;
}//end bubblesort

int main()
{
    Node *head1;

    //创建链表
    head1=Creat();        //head1接受返回的指向头结点指针
    //输出链表
    PrintList(head1);    //将表头指针传给打印函数

    //排序链表
    cout<<"单链表排序"<<endl;
    bubblesort(head1);
    //输出链表
    PrintList(head1);

    //插入节点,注意可能是空表
    cout<<endl<<"请输入要插入的数字"<<endl;
    int i;
    cin>>i;
    Node *head2;
    head2=head1;
    while(i!=0)
    {
        head2=insert(head2,i);
        cin>>i;
    }
    //输出链表
    PrintList(head2);    //注意这应该是head2

    //删除元素
    cout<<endl<<"请输入要删除的元素"<<endl;
    cin>>i;
    while(i!=0)
    {
        head2=delet(head2,i);
        //输出链表
        PrintList(head2);
        cin>>i;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

minyuanxiani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值