线性链表之123

来源:互联网 发布:数据可视化之美 编辑:程序博客网 时间:2024/06/06 09:39

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

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

                                

                                                    数据结点的示意图

单链表:

//线性表的单链表存储结构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))

 
原创粉丝点击