C++ 单链表操作

include //printf() scanf()

include //srand() rand()

include //malloc() NULL

typedef struct Node
{
int data;
struct Node* next;
}Node,*PNode;

//随机建立产生n个元素的值,建立带表头结点的单链线性表,尾插法
//这个链表的头结点就是head,也可以看作这个链表的名字

PNode CreateList( int n )
{
    PNode head,p;
    head=(PNode)malloc(sizeof(Node));
    head->data=NULL;
    p=head;
    PNode temp;
    srand((int)time(0));
    int tt=rand();
    while( n-- ){
        temp=(PNode)malloc(sizeof(Node));
        temp->data=rand();
        p->next=temp;
        p=temp;
    }
    p->next=NULL;
    return head;
}

// 链表的元素个数

int LengthList( PNode head )
{
    PNode p;
    p=head;
    int num=0;
    while( p->next!=NULL ){
        num++;
        p=p->next;
    }
    return num;
}

//打印链表

void PrintList(PNode head)
{
    int n=LengthList( head );
    PNode p;
    p=head->next;
    while( n-- ){
        printf("%d\n",p->data);
        p=p->next;
    }
}

//删除第i个结点,并用e返回它的值

bool DeleteList(PNode head,int i,int &e)
{
    PNode p,q;
    p=head;
    int j=1;
    while( p->next && j<i ){ //找第i-1个结点
        p=p->next;
        j++;
    }
    if( !(p->next) || j>i )
        return false;
    q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);
    return true;
}

//在链表第i个位置之前插入新的数据元素e

bool InsertList( PNode head,int i,int e )
{
    PNode p,q;
    int j=1;
    int len=LengthList(head);
    if( i>len || i <j)
        return false;
    p=head;
    while( p->next && j<i ){
        p=p->next;
        j++;
    }
    if( !(p->next)||j>i )
        return false;
    q=(PNode)malloc(sizeof(Node));
    q->data=e;
    q->next=p->next;
    p->next=q;
    return true;
}

//冒泡法实现单链表的排序
//PNode SortList( PNode head)

void swap( PNode p,PNode q )
{
    int temp;
    temp=p->data;
    p->data=q->data;
    q->data=temp;
}
Node* SortList( Node* head)
{
    Node *p,*q;
    p=head->next;
    int len=LengthList(head);
    int i,j;
    if( len==1 )
        return head;
    for( i=0;i<len-1;i++ ){
        p=head->next;
        for( j=0;j<len-i;j++ ){
            if( p->next ){
                q=p->next;
                if( p->data > q->data ){
                    swap( p,q );
                }
                p=p->next;
            }else
                continue;
        }
    }
    return head;
}

//实现单链表的逆置

Node * ReverseList(Node * head)
{
    Node *pre,*mid,*next;
    if( head==NULL || head->next==NULL )
        return head;
    pre=head->next;
    mid=pre->next;
    pre->next=NULL;
    while( mid ){
        next=mid->next;
        pre=mid->next;
        pre=mid;
        mid=next;
    }
    head->next=pre;

    return pre;

}

//逆置函数2

Node *reverse(Node *head)  
{  
    Node *p1,*p2,*p3;  
    if (NULL == head || NULL == head->next)  
    {  
        return head;  
    }  
    p1 = head;  
    p2 = p1->next;  
    while (NULL != p2->next)  
    {  
        p3 = p2->next;  
        p2->next = p1;  
        p1 = p2;  
        p2 = p3;  
    }  
    p2->next = p1;  
    p1 = p2;  
    head->next->next = NULL;  
    head->next = p1;  
    return head;  
}  

//主函数

int main()
{
    PNode head;
    head=CreateList(10);
    int len=LengthList(head);
    printf("%s%d\n","The length of the List is: ",len);
    PrintList(head);
    int e;
    bool status=DeleteList(head,2,e);
    if( status )    
        printf( "The deleted element is %d\n",e );
    printf("The length of the List is: %d\n",LengthList(head));
    PrintList(head);

    bool status1=InsertList(head,2,10000);
    if( status1 )   
        printf( "The insert element is %d\n",e );
    printf("The length of the List is: %d\n",LengthList(head));
    PrintList(head);

    printf("The sorted List is: %d\n",LengthList(head));
    head=SortList(head);
    PrintList(head);


    printf("The reversed List is: %d\n",LengthList(head));
    head=reverse(head);
    PrintList(head);

    head=ReverseList(head);
    printf("The reversed List is: %d\n",LengthList(head));
    PrintList(head);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值