含头结点单链表的头插入建立和尾插入建立

版权声明:原创文章仅供大家学习使用,严禁转载 https://blog.csdn.net/qq_41809589/article/details/86554477

单链表是线性表中链式存储中较为简单的一种数据存储方式,通常要根据不同情况的需要灵活运用两种建立方式。
先定义结点:

typedef struct Lnode {
	int date;
	struct Lnode *next;
}LNode;

假设:线性表中元素的数据类型是整型,以32767作为元素输入的结束标志。

【头插入法】
从一个空表开始,重复读入数据,生成新结点,读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的第一个位置,直到读入结束标志为止。即每次插入的结点都作为链表的第一个结点(当然除头结点外)。

LNode  *create_LinkList(void)
    /*  头插入法创建单链表,链表的头结点head作为返回值  */  
{    
int data ;
LNode *head, *p; 		 /*  p指向当前结点  */
head= (LNode  *) malloc( sizeof(LNode));
head->next=NULL;      	 /*  创建链表的表头结点head  */ 
while (1) 
{   scanf(“%d”, &data) ;
if (data==32767)  break ;
p= (LNode  *)malloc(sizeof(LNode));
p–>data=data;    	 /*  数据域赋值  */
p–>next=head–>next ;  head–>next=p ; 
 /*  钩链(先右后左),新创建的结点总是作为第一个结点  */
}
return head;
}

在这里插入图片描述
就是上面的插入方式,先让P指向待插入结点的地址域的指针指向头结点后的结点,再让头结点地址域指针指向待插入结点。

【 尾插入法】
头插入法建立链表虽然算法简单,但生成的链表中元素的次序和输入的次序相反。若希望二者次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表的表尾,使其成为当前链表的尾结点。

LNode  *create_LinkList(void)
     /*  尾插入法创建单链表,链表的头结点head作为返回值  */  
{   
int data ;
LNode *head, *rear, *p;
head=rear=(LNode  *)malloc(sizeof(LNode)); 
head->next=NULL;        	/*  创建单链表的表头结点head  */
while (1)
{    scanf(“%d”,& data);
if (data==32767)  break ;
p= (LNode  *)malloc(sizeof(LNode)); 
p–>data=data;    	 /*   数据域赋值  */
p–>next=rear–>next;  rear–>next=p; rear=p; 
/*钩链(先右后左),新创建的结点总是作为最后一个结点*/
}
return head;   
}

rear尾指针始终指向最后一个结点。插入流程为,把尾指针指向结点的地址域的空值赋值给待插入结点的地址域,再把最后一个结点的地址域的指针指向待插入结点,再把p即新的最后一位结点的位置给rear即可。

猜你喜欢

转载自blog.csdn.net/qq_41809589/article/details/86554477