#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; }