C语言 创建单向链表和链表和并

1.创建单向链表

#include  <stdio.h>
#include  <stdlib.h>

typedef struct Node
{
    int x ;    Node *next ;
    } N ;

N* add(int n) ;
void pf(N *hd) ;
void up(N *hd) ;

main(void)
{
    N *hd = NULL;    
    int n ;    
    printf("输入你想要创建节点的数量:\n") ;    
    scanf("%d", &n) ;    
    printf("输入%d个节点数据:\n", n) ;    
    hd = add(n) ;    
    pf(hd) ;    
    up(hd) ;
}

N* add(int n)
{
    N *first, *p, *last ;    
    first = (N *)malloc(sizeof(N)) ;    
    scanf("%d", &first->x) ;    
    last = first ;    
    for (int i = 2 ; i <= n ; i++)    
    {        
        p = (N *)malloc(sizeof(N)) ;        
        scanf("%d", &p->x) ;        
        last->next = p ;        
        last = p ;    
    }    
    last->next = NULL ;    
    return first ;
}

void pf(N *hd)
{
    N *p = hd ;    
    while (p != NULL)    
    {        
        printf("%d ", p->x) ;        
        p = p->next ;    
    }
}

void up(N *hd)
{
    N *p = hd, *pr = NULL ;    
    while (p)    
    {        
        pr = p->next ;        
        free(p) ;        
        p = pr ;    
    }
}

2.链表和并
降序的话把链表和并函数大于号和小于号换一下就行了

#include  <stdio.h>
#include  <stdlib.h>

typedef struct Node
{

    int x ;    
    Node *next ;
    } N ;

N* add(int n) ;
void pf(N *hd) ;
void up(N *hd) ;
N* hb(N *a, N *b) ; 

main(void)
{
    N *a, *b ;    
    int n, m ;    
    printf("请输入你想要为链表a创建节点的数量:\n") ;    
    scanf("%d", &n) ;    
    printf("请输入%d个节点数据(按升序):\n", n) ;    
    a = add(n) ;    
    printf("请输入你想要为链表b创建节点的数量:\n") ;    
    scanf("%d", &m) ;    
    printf("请输入%d个节点数据(按升序):\n", m) ;    
    b = add(m) ;	
    a = hb(a, b) ;    
    pf(a) ;    
    up(a) ;
}

N* add(int n)
{
    N *first, *p, *last ;    
    first = (N *)malloc(sizeof(N)) ;    
    scanf("%d", &first->x) ;    
    last = first ;    
    for (int i = 2 ; i <= n ; i++)    
    {        
        p = (N *)malloc(sizeof(N)) ;        
        scanf("%d", &p->x) ;        
        last->next = p ;        
        last = p ;    
    }    
    last->next = NULL ;    
    return first ;
}

void pf(N *hd)
{
    N *p = hd ;    
    while (p != NULL)    
    {        
        printf("%d ", p->x) ;        
        p = p->next ;    
    }
}

N* hb(N *a, N *b)
{
	N *first = NULL, *last = NULL ;	
	while (a && b)	
	{		
	    if (a->x < b->x)		
	    {			
	        if (first == NULL)			
	        {				
	            first = a ;				
	            last = a ;			
	        }			
	        else			
	        {				
	            last->next = a ;				
	            last = a ;			
	        }			
	        a = a->next ;		
	    }		
	    else if (a->x > b->x)		
	    {			
	        if (first == NULL)			
	        {				
	            first = b ;				
	            last = b ;			
	        }			
	        else			
	        {				
	            last->next = b ;				
	            last = b ;			
	        }			
	        b = b->next ;		
	    }		
	    else		
	    {			
	        if (first == NULL)			
	        {				
	            first = a ;				
	            last = a ;			
	        }			
	        else			
	        {				
	            last->next = a ;				
	            last = a ;			
	        }			
	        a = a->next ;			
	        last->next = b ;			
	        last = b ;			
	        b = b->next ; 		
	    }	
	}	
	if (a)		
    	last->next = a ;	
	if (b)		
	    last->next = b ;	
	return first ;
}

void up(N *hd)
{
    N *p = hd, *pr = NULL ;    
    while (p)    
    {        
        pr = p->next ;        
        free(p) ;        
        p = pr ;    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值