创建链表的同时自动完成结点数据排序

/*
 创建链表时自动完成链表上结点按某一关键字排序
 最简单的方法是在创建链表时用插入结点的方式完成链表的建立

/* C++代码 */

#include <iostream>
using namespace std;

struct  node  //结点结构
{ int data ;
  node * next;
};   

int main()
{
  node * CreateList( );  //建立链表函数声明
  void  PrintList( node *); //输出链表中结点信息函数声明
  node * InsertNode(node *,node *); //在链表中插入结点函数声明
  node * deleteAll(node *);//删除整个链表
  int linkLength(node * head); //获取链表中结点个数
  node * head=NULL;
  cout<<"开始创建链表,请输入结点数据,当输入数据为0时,建立链表完毕"<<endl;
    /*创建链表*/
  head=CreateList( ); //调用链表创建函数,返回所建链表的头指针
    /*遍历输出链表*/
  PrintList(head);  //调用链表遍历函数,输出全部结点信息
    /*删除整个链表*/
  cout<<"\n链表上结点个数为:"<<linkLength(head)<<endl;
  head=deleteAll(head);
  cout<<"删除整个链表后,链表上的结点个数为:"<<linkLength(head)<<endl;

    return 0;

}

node * CreateList( ) //建立链表函数声明,通过插入结点来建立链表
{  node * InsertNode(node *,node *); //在链表中插入结点函数声明
   node *head=NULL;
   node *s;
   s=new node;
   cin>>s->data;
   s->next=NULL;
   while(s->data!=0)
   {
      head=InsertNode(head,s);
      s=new node;
      cin>>s->data;
      s->next=NULL;
   }
   return head;
}

node * InsertNode(node *head,node * s)  //插入结点的函数,head为链表头指针,s指向要插入的新结点
{node *p,*q;
 p=head;   //使p指向链表中的第一个结点
 if(head==NULL)      //原来的链表是空表
 { head=s;           //使head指向的新结点作为头结点
   s->next=NULL;
 }
 else  //原来的链表不是空表
 {while((s->data>p->data) && (p->next!=NULL)) //用循环定位要插入的结点位置p,使s插入到p之前的位置
    {q=p;  //q记录下当前的p,即q指向p的前一个结点
     p=p->next;   //p后移一个结点
    }
  if(s->data<=p->data)  //要插入的结点数据比最后一个结点数据小
  {   if(head==p)  //判断是否插入链表中的第一个结点之前
      { head=s;  //插到原来第一个结点之前
         s->next=p;
     }
      else  //插到q指向的结点之后,p指向的结点之前
      { q->next=s;
        s->next=p;
      }
  }
  else   //要插入的结点数据比最后一个结点数据还大
  {  p->next=s;    // 插到链表最后的结点之后,作为链表的尾结点
     s->next=NULL;
  }
 }
   cout<<"成功完成一个新结点插入..."<<endl;
   return (head);
}  

void  PrintList( node * head)  //输出链表中结点信息函数,链表遍历
{    node *p=head;
     int i=1;
     cout<<endl<<"遍历链表..."<<endl;
    if (head!=NULL)  //如果链表非空,即链表中有结点
        do             //循环输出接点数据,直到移动到链表尾,即最后一个结点
        {     cout<<"第"<<i++<<"个结点数据为:"<<p->data<<endl;
               p=p->next;
        }while(p!=NULL) ;
    else
    {
      cout<<"链表是空链表!"<<endl;
    }
}  

node * deleteAll(node *head)//删除整个链表
{
   if(head!=NULL)
   {
      node *p,*q;
      p=head;
      q=head;
      do
      {p=p->next;
       head=p;
       delete q;
       q=p;
      }while(p!=NULL);
      head=NULL;
   }
     return head;
}

 int linkLength(node * head) //获取链表中结点个数
 {
    int n=0;
    node *p;
    if(head==NULL)
        return 0;
    else
    { p=head;
      while(p!=NULL)
      {
        n++;
        p=p->next;
      }
      return n;
    }
 }

时间: 2024-10-22 13:19:40

创建链表的同时自动完成结点数据排序的相关文章

链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)

1.指针的联动 通过两个指针分别指向前驱和后继结点,并在单向链表上进行移动,当指针指向待处理的结点时,该结点的前驱也有指针指向. 2.设有一个无序单向链表,且数据域的值均不相同,使指针pmin指向最小值结点,并使指针prem指向最小值结点的前驱结点: 代码片段: for(p = head; p; q = p, p = p->next) { if(pmin->data > p->data) { pmin = p; prem = q; } } 3.单向链表的删除算法 注:使用mallo

使用C++创建链表

C++创建链表的思路和C语言一样只是实现的方式不同 C++创建链表的思路http://blog.csdn.net/u010105970/article/details/24345739 程序代码: #include <iostream> #include <cstdlib> using namespace std; class Node//结点结果 { public: void Create_list();//创建链表 void Traverse_list();//遍历链表 pri

链表《3》在链表中插入新的结点

下图是一个创建好的链表 下面我们需要在链表中插入一个结点,例如我们需要在第3个结点后插入一个结点 首先定义一个指针p,并且将p移动到第3个结点处 创建一个新结点pNew并且初始化pNew pNew->data = 20 然后定义一个指针q将q指向p第4个结点 最后将p指向pNew,pNew指向q即可实现在链表中第3个结点后插入一个新结点 即: p->pNext = pNew; pNew->pNext = q; 插入后的效果: 程序代码: #include <stdio.h>

创建链表LinkedList

链表是由若干个节点的对象组成的一种数据结构分为单链表和双链表. 单链表:每个节点含有一个数据和下一个节点对象的引用. 双链表:每个节点含有一个数据并含有上一个节点对象的引用和下一个节点对象的引用. 创建链表 使用Java.util包中的LinkedList类可以创建一个链表对象 例如 LinkedList mylist=new LinkedList();//创建一个空双链表 可以使用add方法向链表依次增加节点 例如 mylist.add("加入的数据"); mylist可以使用方法p

AngularJS:实现页面滚动到底自动加载数据的功能

要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序http://sroze.github.io/ngInfiniteScroll/ 目前版本是1.0.0 2. 如果你是用的jQuery2.0以上版本,还需要修改ng-infinite-scroll.js程序,将所有的将所有的$window.xxx改为$(window).xxx, elem.xxx改为$(

七色花基本权限系统(6)- 让EntityFramework Code First自动合并/迁移/数据初始化

在前一章节里,我们已经能够对映射字段进行配置了.但在演示中,我们通过删除原数据库让EF重新创建的方式,才把新的字段信息更新(其实是破而后立)到了数据库.这显然无法让人接受.在这篇日志里,将演示"在实体类发生改变时如何自动更新数据库中的表结构"和"在EF创建数据库的时候如何初始化一批数据". 合并/迁移 合并是指"新的实体模型映射到数据库中,更新其结构",例如: 新增了实体类,那在数据库中就是新增数据表. 删除了实体类,那在数据库中就是删除数据表.

算法题:求链表倒数第K个结点

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个. <剑指offer>上面给的解法是设置两个指针,这里记为p1.p2,先让p2走(k-1)步,然后p1.p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点. 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步:(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL.显然这样不太

JAVA单链表的实现-不带头结点且没有尾指针

本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java