链表的一些基础题

1;程序;线性表ab为按元素递增有序排列的;
程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点,在a链表的基础上。
2; 原地倒置;传递指向头节点的指针

/*
    程序;线性表ab为按元素递增有序排列的;
        程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点
        在a链表的基础上。

*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int elem;
    struct node*next;
}Node;
void Creat_lb(Node * s, int m);
void Print_lb(const Node *s);
void marge_lb(Node *a, Node *b);
int main()
{
    Node a,b;
    int num_a,num_b;
    printf("请输入链表a的项数\n");
    scanf("%d",&num_a);
    Creat_lb(&a,num_a);
    //Print_lb(&a);
    printf("请输入链表b的项数\n");
    scanf("%d",&num_b);
    Creat_lb(&b,num_b);
    printf("输出链表a并b\n");
    marge_lb(&a,&b);
    Print_lb(&a);

    return 0;
}
void marge_lb(Node *a, Node *b)
{
    Node * pa, *pb, *pc, *pb1=NULL;
    pa = a->next;
    pb = b->next;
    pc = a;//在a链表的基础上修改
    while(pa != NULL && pb != NULL){
        if(pa->elem  < pb->elem){
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else if(pa->elem  > pb->elem){
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
        else{
            pc->next = pa;
            pc = pa;
            pa = pa->next;
            pb1 = pb;
            pb = pb->next;
            free(pb1);//将这个节点内存释放。
        }
    }
    if(pa == NULL){
        while(pb != NULL){
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    else{
        while(pa != NULL){
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
    }
}
void Creat_lb(Node * s, int m)
{
    Node *p, *q;
    q = s;
    for(int i = 0; i < m; i++){
        p  = (Node *)malloc(sizeof(Node));
        scanf("%d",&p->elem);
        p->next = NULL;
        q->next = p;
        q = p;
    }
}
void Print_lb(const Node *s)
{
    Node * p;
    p = s->next;
    while(p!=NULL){
        printf("%d ",p->elem);
        p = p->next;
    }
}
/*
    程序;链表的就地逆置
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int elem;
    struct node* next;
}Node;
void Creat_lb(Node *s,int m);
void Print_lb(const Node *s);
void Inversion_lb(Node * s);
int main()
{
    Node a;
    Creat_lb(&a,4);
    Inversion_lb(&a);
    Print_lb(&a);

    return 0;
}
/*
    原地倒置;传递指向头节点的指针
        1;思想就是头插法思想,
        2;注意要先将一个节点插入(将第二个节点插入第一个节点和头结点之间)
            之后的指向就是。q依然指向头结点。p1指向第二个节点,p指向第三个节点(也就是下次即将插入的节点)
            其余节点则可以使用while循环;
        3;

*/
void Inversion_lb(Node * s)
{
    Node * p, *q, *p1;
    q = s;//q始终是指向头结点的。
    p = s->next;//p为插入前节点的前一个节点;
    if(p->next == NULL){
        return ;
    }
    q->next = p;//先插入一个节点
    p1 = p->next;
    p->next = NULL;//这就是最后一个节点要使得next=NULL;
    p = p1->next;
    p1->next = q->next;
    q->next = p1;
    while(p!=NULL){
        p1 = p;//p1指向的是要插入的节点
        p = p->next;//p指向的是下一个要插入的节点
        p1->next = q->next;//插入的两个步骤,1.这个节点与后面链表的链接
        q->next = p1;//这个节点与头结点的链接;
    }
}
void Creat_lb(Node *s,int m)
{
    Node *p,*q;
    p = s;
    for(int i = 0; i < m; i++){
        q = (Node *)malloc(sizeof(Node));
        scanf("%d",&q->elem);
        q->next = NULL;
        p->next = q;
        p = q;
    }
}
void Print_lb(const Node *s)
{
    Node * p;
    p = s->next;
    while(p != NULL){
        printf("%d ",p->elem);
        p = p->next;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值