链表的创建

1,链表的储存方式:
链式储存(存储单元不连续)
而顺序存储以连续的储存单元进行存储。
链式存储不可计算存储单元的地址,只可以存储的形式记录某一节点的地址
2,结点的结构:(结构体类型)

数据域指针域
datanext
struct node{ 
    int data;  
    struct node *next;                   //next指向struct node 类型的单元
    };

**关于typedef:类型重命名 用法: typedef 类型 重命名;

struct node{       
      int data;   
      struct node *next;   
         };typedef struct node ElemSN;
 typedef struct node{          
       int data;            
       struct node *next;       
         }ElemSN;

3,结点单元的分配:
ElemSN p;p=(ElemSN)malloc(sizeof(ElemSN));
引用成员:p->data; p->next;
4,链表的术语及特点:
术语:
前驱结点及后继结点:
链表中相邻的两结点,前驱结点的指针域存放后继结点的地址,或者说,前驱结点指针域指向后继结点。
终端结点:
头结点(单向链表中没有前驱结点的结点)
尾结点(单向链表中没有后继结点的结点)
线性链表的特点:
(1)有且只有一个结点无前驱结点(头结点)
(2)有且只有一个结点无后继结点(尾结点)
(3)除头尾结点以外其余结点有且只有一个前驱有且只有一个后继
5,创建单向链表:
最初建链方法:

ElemSN *CreateLink(int a[])
{	
        ElemSN *p,*h,*tail;    //创建头结点	
        h=tail=(ElemSN*)malloc(sizeof(ElemSN));	
        h->data=a[0];
	h->next=NULL;	
	for(int i=1;i<N;++i)
	{		
	    p=(ElemSN*)malloc(sizeof(ElemSN));		
	    p->data=a[i];	   
	    p->next=NULL;
            tail->next=p;	
	    tail=p;	
	}
	return h;
 } 

因为头节点要单独返回,所以先创建创建头节点,尾节点与中间节点用for循环创建

ElemSN *CreateLink(int a[])
{	
      ElemSN *p,*h=NULL,*tail;  
      for(int i=0;i<N;++i)
      {		
         p=(ElemSN*)malloc(sizeof(ElemSN));		
         p->data=a[i];
         p->next=NULL;
         if(!h)	
         tail=h=p;	
         else
         tail=tail->next=p;
         	}	
        return h; 
  } 

改进了头节点需要单独创建的缺点

ElemSN *CreateLink(int a[])
{
	ElemSN *h=NULL,*tail;  
	tail=h=(ElemSN*)malloc(sizeof(ElemSN));
	h->data=a[0];
	h->next=NULL;
	for(int i=1;i<N;++i)
	{	
	     tail=tail->next=(ElemSN*)malloc(sizeof(ElemSN));		
	     tail->data=a[i];
	     tail->next=NULL;
	  }	
	return h;
 } 

去掉了指针p

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值