数据结构链表示例

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

转载于:https://www.cnblogs.com/zhangjunjie/p/3368288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值