KLSeis

导航

 
#include <iostream>
using namespace std;

typedef struct Sun
{
    int num;
    struct Sun* next;
}Node;

/*头指针:头指针所指节点的数据域往往为空或者可以存放链表
<br>长度等类似信息,其next域指向的节点才是第一个有效节点*/

/*用头插法和尾插法两种方式创建有头指针的单链表,返回头指针*/

//头插法
Node* headCreate()
{
    Node *head = new Node;
    head->next = NULL;
    int value;
    std::cout<<"用头插法创建有头指针的单链表,返回头指针,输入0结束创建."<<std::endl;
    std::cout<<"输入一个整数:";
    std::cin>>value;
    while ( value )
    {
        Node *temp = new Node;
        temp->num = value;
        temp->next = head->next;
        head->next = temp;
        std::cout<<"输入一个整数:";
        std::cin>>value;
    }
    return head;
}

//尾插法
Node* tailCreate()
{
    Node *head = new Node, *ptr = head;
    head->next = NULL;
    int value;
    std::cout<<"用尾插法创建有头指针的单链表,返回头指针,输入0结束创建."<<std::endl;
    std::cout<<"输入一个整数:";
    std::cin>>value;
    while ( value )
    {
        Node *temp = new Node;
        temp->num = value;
        temp->next = NULL;
        ptr->next = temp;
        ptr = temp;
        std::cout<<"输入一个整数:";
        std::cin>>value;
    }
    return head;
}

//用尾插法创建了一个没有头指针的单链表,返回第一个节点的指针
Node* create()
{
    Node *p = NULL, *first = NULL;
    int value;
    std::cout<<"创建单链表,返回第一个节点的指针,输入0结束创建."<<std::endl;
    std::cout<<"输入一个整数:";
    std::cin>>value;
    if ( 0 == value )
    {
        std::cout<<"没有创建节点."<<std::endl;
        return first;
    }
    else
    {
        p = new Node;
        p->num = value;
        p->next = NULL;
        first = p;
    }

    std::cout<<"输入一个整数:";
    std::cin>>value;
    while ( value )
    {
        Node *ptr = new Node;
        ptr->num = value;
        ptr->next = NULL;
        p->next = ptr;
        p = ptr;
        std::cout<<"输入一个整数:";
        std::cin>>value;
    }

    return first;
}

 包括:头插法和尾插法创建有头指针的单链表、尾插法创建没有头指针的单链表、删除单链表的节点、

/*!
\brief 删除单链表中的节点
\param Node* head 链表
\<br>  int data 要删除节点数据域的值
\return Node* 执行删除操作之后的单链表
\note1 仅删除首个数据域为num的节点
*/
Node* delNode( Node* head, int data )
{
    Node *ptr1 = head, *ptr2;
    while ( data != ptr1->num && NULL != ptr1->next )
    {
        ptr2 = ptr1; ptr1 = ptr1->next;
    }

    if ( data == ptr1->num )
    {
        if ( ptr1 == head )
        {
            head = head->next;
            ptr1->next = NULL;
            delete ptr1;
        } 
        else
        {
            ptr2->next = ptr1->next;
            ptr1->next = NULL;
            delete ptr1;
        }
    } 
    else
    {
        std::cout<<"不存在"<<data<<"值的节点"<<std::endl;
    }
    return head;
}

 

/*!
\brief 单链表的插入
\param Node* head 链表
\<br>  int data 要插入节点数据域的值
\return Node* 执行插入操作之后的单链表
\note1 按数据域中的num值插入,插在首个比data大的节点之前
*/
Node* insertNode( Node* head, int data )
{
    Node *temp = new Node, *ptr1 = head, *ptr2;
    temp->num = data;
    while ( data > ptr1->num && ptr1->next != NULL )
    {
        ptr2 = ptr1; ptr1 = ptr1->next;
    }

    if ( data <= ptr1->num )
    {
        if ( ptr1 == head )
        {
            temp->next = head; head = temp;
        } 
        else
        {
            temp->next = ptr1; ptr2->next = temp;
        }
    } 
    else
    {
        ptr1->next = temp; temp->next = NULL;
    }
    return head;
}

 

/*!
\brief 单链表的逆置
*/
Node* reverseLink( Node* head )
{
    if ( head == NULL || head->next == NULL )
        return head;

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

 

posted on 2014-03-13 21:09  KLSeis  阅读(193)  评论(0编辑  收藏  举报