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

来源:互联网 发布:淘宝店主跑路 编辑:程序博客网 时间:2024/05/17 03:56
#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 bubblesortint 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;}

原创粉丝点击