C++链表应用

2019-02-15 17:19

C++链表应用

#include

#include

struct Node {

int num ; Node *next ; };

Node* Create() // 链表创建 { int n=0;

Node *p1,*p2,*head; p1=p2=new Node; cin>>p1->num; head=NULL;

while (p1->num!=0) {

if (n==1) {

head=p1; } else

p2->next=p1; p2=p1;

p1=new Node; cin>>p1->num; n++; }

p2->next=NULL;

return head; }

int ListLength(Node L) // 链表的计数

{

Node p=L; int count=0; while(p->next) {

count++; p=p->next; }

return count; }

int Search(Node &L , int value) // 链表的查找 {

Node p=L; int index=0; while(p) {

if(p->num== value)

return index; p=p->next; index++; }

return 0; }

void Print(Node *head) // 输出链表 {

Node* p=head; while (p) {

coutnext; } cout< }

void Destruct(Node *head) // 清空链表 {

Node *current = head, *temp = NULL; while (current) {

temp = current;

current = current ->next; delete temp; } }

Node *ReverseList(Node *head) // 链表逆序(循环方法) {

Node *p,*q,*r;

p=head; // 一开始 p 指向第一个节点 q=p->next; //q 指向第二个节点 while (q!=NULL) // 如果没到链尾 { // 以第一次循环为例

r=q->next; //r 暂时存储第三个节点

q->next=p; // 没执行此句前, q->next 指向第三个节点 // 执行之后, q->next 指向第一个节点 p p=q; // 之后 p 指向第二个节点 q=r; //q 指向第三个节点

// 即 ...p=>q=>r... 变为 ...p<=q<=r... }

head->next=NULL; // 最后原来的链头变为链尾,把它指向 NULL 。 head=p; // 原来的链尾变成链头 return head; }

Node *ReverseList2(Node *head) // 链表逆序(递归方法) {

if (!head) {

return NULL; }

Node *temp = ReverseList2 (head->next);

if (!temp)

{

return head; }

head->next->next = head; head->next = NULL;

return temp; }

递归时 ,head 可以分别用 head , head1,head2 ...headn-1, headn 来表示总共 n+1 个节点 temp = ReverseList2( head->next ); 此句的递归一直将参数传进来的。 Node* head 递归到 headn 然后判断下列语句: else if( !headn->next ) {

return headn; }

将返回值传给 temp, 此时 temp 指向链尾 , 由于在此次返回 , 故此次没有执行最后的 else 的那部分的语

句 , 返回上一级即是 headn-1 那一级 , 继续执行 下面的 headn-1->next->next = headn-1;

headn-1->next = NULL; // 此两句将最后两个逆序连接 , return temp;

// 之后返回 temp 比上一层的 temp 即是执行 temp = ReverseList2( head->next ) 赋值 , 因为

递归的口都是在这里的 , 如果说好理解点也可以将 temp 来编号 同理

在返回 temp 后 , 继续执行

headn-2->next->next = headn-2; headn-2->next = NULL; return temp; .....

一直到 head 时 即是原链表的第一个节点 , 在对其 head->next = NULL 后 , 此时以 temp 所指向的

节点为链头的逆序链表就形成了 .

// 已知两个链表 head1 和 head2 各自有序, 请把它们合并成一个链表依然有序。(循环方法) //( 保留所有结点, 即便大小相同)

Node *Merge(Node *head1 , Node *head2) {

if ( head1 == NULL) return head2 ; if ( head2 == NULL)

return head1 ;

if ( head1->num < =head2->num ) {

head = head1 ; head1= head1->next; } else {

head = head2 ;

head2 = head2->next ; }

Node *temp = head ;

while ( head1 != NULL && head2 != NULL) {

if ( head1->num <= head2->num ) {

temp->next = head1 ; head1 = head1->next ;

temp =temp->next; } else {

temp->next = head2; head2 = head2->next ; temp =temp->next; } }

if (head1 == NULL) temp->next = head2; if (head2 == NULL) temp->next = head1; return head; }

// 已知两个链表 head1 和 head2 各自有序, 请把它们合并成一个链表依然有序。(递归方法)Node *MergeRecursive(Node *head1 , Node *head2) {

if ( head1 == NULL ) return head2 ; if ( head2 == NULL)


C++链表应用.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:VC++总复习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: