单链表实现一元多项式相加_单链表的实现

单链表实现一元多项式相加_单链表的实现_第1张图片

代码有解释,可能一开始看不到,更着动手多敲几遍就能掌握了。

加油。

//节点结构
struct list_node
{
	int data;
	struct list_node *next;
 }
typedef struct list_node list_single;
//创建单链表节点
list_single *create_list_node(int data)
  {
  	list_single *node=NULL;  //1、首先,当然是定义一个头指针
  	node=(list_single*)malloc(sizeof(list_single));//2、然后分配内存空间
  	if(node==NULL)
  	{
  		printf("malloc fair!");
	  }
	  
	memset(node,0,sizeof(list_single));//3、清一下
	node->data=data;//4、给链表节点的数据赋值
	node->next=NULL; //5、将链表的指针域指向空
	return node;
  }

//链表的尾插 
void tail_insert(list_node *head ,list_node *new)

{

	//获取当前的位置 

	list_node *p = head ; 

	//如果当前位置的下一个节点不为空 

	while(NULL != p->next)

	{

		//移动到下一个节点 

		p = p->next ;

	}

	//如果跳出以上循环,所以已经到了NULL的这个位置

	//此时直接把新插入的节点赋值给NULL这个位置 

	p->next = new ;

}
//链表的头插 

void top_insert(list_node *head ,list_node *new)

{

	list_node *p = head ;

	new->next = p->next ;

	p->next = new ;

}
//链表的遍历 

void Print_node(list_node *head )

{

	//获取当前的位置 

	list_node *p = head ;

	//获取第一个节点的位置 

	p = p->next ;

	//如果当前位置的下一个节点不为空 

	while(NULL != p->next)

	{

		//(1)打印节点的数据 

		printf("id:%dn",p->data);

		//(2)移动到下一个节点,如果条件仍为真,则重复(1),再(2) 

		p = p->next ;

	}

	//如果当前位置的下一个节点为空,则打印数据

	//说明只有一个节点 

	printf("id:%dn",p->data);

}

//删除链表中的节点 

int detele_list_node(list_node *head , int data)

{

	//获取当前头节点的位置 

	list_node *p = pH ;

	list_node *prev = NULL; //当前节点的上一个节点

	while(NULL != p->next)

	{

		//保存当前节点的前一个节点的指针 

		prev = p ;

		//然后让当前的指针继续往后移动 

		p = p->next ; 	

		//判断,找到了要删除的数据  

		if(p->data == data)

		{

			//两种情况,一种是普通节点,还有一种是尾节点

			if(p->next != NULL)  //普通节点的情况 

			{

				prev->next = p->next ;

				free(p);

			}

			else //尾节点的情况 

			{

				prev->next = NULL ; //将这个尾节点的上一个节点的指针域指向空 

				free(p); 

			}

			return 0  ;

		}

	}

	printf("没有要删除的节点n");

	return -1 ;

}
//单链表的逆序---方法一(循环)
list_single *trave_list(list_node *head)
{
	list_node * p_next=head->next->next   #下一个节点
	list_node *current=head->next;       #当前节点
	
	
	if(current==NULL||current->next==NULL) #空链表或者只有一个结构时
	 	return;
        head->next==NULL     #只保留头节点 
	while(current!=NULL)#头插法
	{
		p_next=current->next;
		current->next=head->next;# 当前节点指向头节点 
		head->next=current;  # 头节点指向当前节点
		current=p_next; 
	 }	
       return head;
}

//单链表的逆序---方法二(递归)
list*reverse_recursive(list_node *head) 
{
	list_node *cur; 
	cur=head;
	if(cur->next==NULL) //有一个节点
	  return head;
	if(cur->next->next!=NULL) //有多个节点
	{
		head=reverse_recursive(cur->next);
		cur->next->next=cur;
		cur->next=NULL;
	  }
	  
	else        //只有两个节点
	{
		head=cur->next;
		cur->next->next=cur;
		cur->next=NULL;
		
	  }  
}
int main(int argc , char **argv) 

{

	//创建第一个节点 

	int i ;

	list_node *header = create_list_node(0); 

	for(i = 1 ; i < 10 ; i++)

	{

		tail_insert(header,create_node(i));

	}

	Print_node(header);

	detele_list_node(header,5);

	putchar('n');

	Print_node(header);

	putchar('n');

	trave_list(header);

	Print_node(header);

	return 0 ;

}

你可能感兴趣的:(单链表实现一元多项式相加)