#include<iostream>
#include<stdlib.h>
using namespace std;
int n;
typedef int ElemType;
typedef struct LNode{
ElemType elem;
LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(0);
L->next=NULL;
return 1;
}
int CreateAscend(LinkList &L,int n){
int i=1;
if(n<=0)
return 0;
InitList(L);
printf("请输入%d个元素\n",n);
LinkList s,p,q;
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->elem);
L->next=s;
s->next=NULL;
while(i<n){
s=(LinkList)malloc(sizeof(LNode));
p=L->next;
q=L;
scanf("%d",&s->elem);
while(p&&(p->elem<=s->elem)){
q=p;
p=p->next;
}
s->next=p;
q->next=s;
/**************
修改**************/
if(!p){
q->next=s;
s->next=NULL;}
/**************/
//s->next=q->next;
//q->next=s;
i++;
}
}
void ScanList(LinkList &L){
LinkList p;
p=L->next;
printf("请输入链表%d个元素数升序输出\n",n);
while(p){
printf("%-5d",p->elem);
p=p->next;
}
}
int main(){
LinkList L;
printf("请输入链表的元素数\n");
scanf("%d",&n);
CreateAscend(L,n);
ScanList(L);
system("pause");
return 0;
}
/*
int CreateAscend(LinkList &L,int n)
InitList(LinkList &L)
ScanList(LinkList &L)
这三个LinkList &L都要加 &不然为造成指针丢失,例如:
LinkList L中的 L为指向 struct LNode{
ElemType elem;
LNode *next;
}
的指针,你在调用 CreateAscend(L,n);时由于把 int main()的中LinkList L给了 CreateAscend(L,n)的 L当不加&时由于是指针给了指针所以相当时
调用函数中的l中的形参l指向实参l 是实参的地地(指针在末初始化之前时指向内存中的垃圾单元是不可用用的)暂时说能用接着说:
所以你的这个函数形参指向的也是不可能的 当你为 int InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(0);
L->next=NULL;
return 1;
}时是把 L指向了在堆中分配的 (LinkList)malloc(sizeof(LNode))所以此时不指向实参叫做丢失了,假如你想用有一个方法就是用二级指针
*/
/*
二级指针 :
#include<iostream>
#include<stdlib.h>
using namespace std;
int n;
typedef int ElemType;
typedef struct LNode{
ElemType elem;
LNode *next;
}LNode,*LinkList;
int InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));
if(!*L)
exit(0);
(*L)->next=NULL;
return 1;
}
int CreateAscend(LinkList *L,int n){
int i=1;
if(n<=0)
return 0;
InitList(L);
printf("请输入%d个元素\n",n);
LinkList s,p,q;
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->elem);
(*L)->next=s;
s->next=NULL;
while(i<n){
s=(LinkList)malloc(sizeof(LNode));
p=(*L)->next;
q=(*L);
scanf("%d",&s->elem);
while(p&&(p->elem<=s->elem)){
q=p;
p=p->next;
}
s->next=p;
q->next=s;
/**************
修改**************
if(!p){
q->next=s;
s->next=NULL;}
/*************
//s->next=q->next;
//q->next=s;
i++;
}
}
void ScanList(LinkList *L){
LinkList p;
p=(*L)->next;
printf("请输入链表%d个元素数升序输出\n",n);
while(p){
printf("%-5d",p->elem);
p=p->next;
}
}
int main(){
LinkList L;
printf("请输入链表的元素数\n");
scanf("%d",&n);
CreateAscend(&L,n);
ScanList(&L);
system("pause");
return 0;
}*/