线性链表之123

     就这么东打一枪西打一枪的混过了一个月的时间,虽然还只能算作入门,但对数据结构也算小有那么点了解了。线性链表--线性表的链式存储结构,区别对待于顺序存储结构。

    线性链表的结点分为两部分:数据域和指针域。数据域,顾名思义存储数据元素信息的域;指针域,用于存储直接后继(前驱)的存储位置

                                

                                                    数据结点的示意图

单链表:

//线性表的单链表存储结构
typedef struct Lnode{
       Elemtype     data;
       struct Lnode      *next;
}Lnode,*Linklist;

                                                  单链表存储结构示意图

注意:

由于链表中第一个结点没有直接前驱,所以必须设置一个头指针head存储第一个结点的地址。最后一个结点没有直接后继,其指针域应为空指针,C语言用NULL或0来表示,在图中表示为“∧”。
 
单链表操作中的malloc和free函数:
原型:(在头文件stdlib.h中声明)
         void  *malloc(size_t size);(动态内存的分配)
         malloc函数申请一块连续的内存,它会向程序返回一个指向这块内存的指针,如果申请失败,就会返回一个NULL指针,因此,每次检查malloc返回的指针是非常必要的。size表示其申请的字节(字符)数。
例子:
int *pi;
pi=malloc(128);
...

实际上其与pi=malloc(32*sizeof(int))完全一样,而且后者的好处也很明显
void   free(void *pointer);(动态内存的释放)
    p=(LinkList)malloc(sizeof(LNode)):系统生成一个Lnode型的结点,同时将该结点的起始位置赋给指针变量p;
   Free(q):系统回收一个Lnode型的结点,回收后的空间可以备作再次生成结点时用。
可能会有人在单链表创建上犯点儿迷糊,下面的代码希望能够帮到大家。
 
n个结点单链表的创建:
1.逆位序:
Void CreateList-L(LinkList L,int n){   
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
   if(L=(LinkList )malloc(sizeof(Lnode)))==NULL) exit(1);
   L–>next=null;//先建立一个带头结点的单链表(头结点的指针域为空)   
  int i;
   for(i=n;i>0;--i) {
     if((p=(LinkList )malloc(sizeof(Lnode)))==NULL)
       exit(1);
     scanf(("%d",&p–>data); //输入元素值
       p–>next= L–>next;
       L–>next=p;
     }//for
}// CreateList-L       算法的时间复杂度:O(listlength(L)

2.正位序:
 
Void CreateList-L(LinkList L,int n){
 //正位序输入n个元素的值,建立带表头结点的单链线性表L
    if(( L=(LinkList )malloc(sizeof(Lnode)))==NULL)
      exit(1);
    L–>next=null;//先建立一个带头结点的单链表(头结点的指针域为空)
   q=L;
     int i; 
     for(i=1;i<=0;++i) {
     if(p=(LinkList )malloc(sizeof(Lnode)))=NULL)//生成新结点并检验申请内存是否成功 
     exit(1); 
     scanf(("%d",&p–>data); //输入元素值 
   q–>next=p; 
     q=q–>next; }//for
}// CreateList-L 算法的时间复杂度:O(listlength(L))

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值