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