• 带头节点的链表


    链表的基本操作

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    typedef int type;
    typedef struct Node
    {
        type info;
        struct  Node *next;
    }node;
    //建立一个头节点并将其指针返回
    node *node_init()
    {
        node *head=(node*)malloc(sizeof(node));
        head->next=NULL;
        return head;
    }
    //打印一个链表
    void node_display(node*head)
    {
        node*p=head->next;
        if(!p){
            printf("EMPTY
    ");
        }
        else{
            while(p){
                printf("%5d",p->info);
                p=p->next;
            }
            printf("
    ");
        }
    }
    //找到第n个节点并返回其指针,若n==0则返回头节点指针
    node* node_find(node*head,int n)
    {
        int i=0;
        node *p=head;
        if(n<0){
            printf("not
    ");
            return NULL;
        }
        else if(n==0){//第零个位置的节点:头节点
            return head;
        }
        while(p&&i<n){//找到第i个节点的地址
            p=p->next;
            i++;
        }
        if(!p)printf("not
    ");
        return p;
    }
    //在pos个节点的位置插入一个值为num的节点
    void node_insert(node*head,int pos,type num)
    {
        node*pre=node_find(head,pos-1),*q;//找到前驱节点
        if(!pre){
            printf("not
    ");
        }
        else{
            q=(node*)malloc(sizeof(node));
            q->info=num;
            q->next=pre->next;
            pre->next=q;
        }
    }
    //删除第pos个节点
    void node_dele(node*head,int pos)
    {
        node*pre=node_find(head,pos-1),*q;
        if(!pre){
            printf("not
    ");
        }
        else{
            q=pre->next;
            pre->next=q->next;
            free(q);
        }
    }
    //删除整个链表并释放内存
    void node_destory(node*head)
    {
        node*p=head,*q;
        while(p){
            q=p->next;
            free(p);
            p=q;
        }
    }

    课后习题部分


    //返回第i个节点的值
    type node_get(node*head,int i)
    {
        node*p=node_find(head,i);
        if(!p){
            printf("not
    ");
            exit(1);
        }
        return p->info;
    }
    //返回值为x的节点的位置是第几个节点
    int node_Get(node*head,type x)
    {
        int i=1;
        node*pre=head,*p=head->next;
        while(pre&&p&&p->info!=x){
            pre=p;
            p=p->next;
            i++;
        }
        if(p)return i;
        else return -1;
    }
    //返回值为x的节点的指针
    node*node_Find(node*head,type x)
    {
        node*pre=head,*p=head->next;
        while(pre&&p&&p->info!=x){
            pre=p;
            p=p->next;
        }
        if(p){
            return p;
        }
        else{
            printf("not
    ");
            return NULL;
        }
    }
    //把p2链表连接的p1后面
    void node_cat(node*p1,node*p2)
    {
        node*p=p1;
        while(p->next){
            p=p->next;
        }
        p->next=p2->next;
        free(p2);
    }
    //把p2链表插入到p1节点的第n个节点的位置
    void node_Insert(node*p1,int n,node*p2)
    {
        node*pre=node_find(p1,n-1),*p=p2;
        if(!pre){
            printf("node_Insert error
    ");
        }
        else{
            while(p->next){
                p=p->next;
            }
            p->next=pre->next;
            pre->next=p2->next;
            free(p2);
        }
    }
    //删除p1,节点的从begin开始的n个节点
    void node_Del(node*p1,int begin,int n)
    {
        int i;
        for(i=1;i<=n;i++)
            node_dele(p1,begin);
    }
    //返回节点的和
    int node_sum(node*head)
    {
        node*p=head->next;
        int sum=0;
        while(p){
            sum+=p->info;
            p=p->next;
        }
        return sum;
    }
    //创建链表,当输入的值为负数结束
    void node_create(node*head)
    {
        node*p=head,*pre;
        while(1){
            pre=(node*)malloc(sizeof(node));
            pre->next=NULL;
            scanf("%d",&pre->info);
            if(pre->info<0){
                free(pre);
                break;
            }
            else{
                p->next=pre;
                p=pre;
            }
        }
    }
    //计算链表节点数
    int node_count(node*head)
    {
        int i=0;
        node*p=head->next;
        while(p){
            p=p->next;
            i++;
        }
        return i;
    }
    //在值为y的节点前面插入x
    void node_insert_xy(node *head,type x,type y)
    {
        node*p=head,*pre=p->next,*q;
        while(pre&&pre->info!=y){
            p=pre;
            pre=pre->next;
        }
        if(pre&&pre->info==y){
            q=(node*)malloc(sizeof(node));
            q->next=NULL;
            q->info=x;
            q->next=pre;
            p->next=q;
        }
        else printf("error
    ");
    }
    //倒置链表
    void node_reverse(node*head)
    {
        node*pre=NULL,*mid=head->next,*next;
        while(mid){
            next=mid->next;
            mid->next=pre;
            pre=mid;
            mid=next;
        }
        head->next=pre;
    }
    //将链表的偶数部分保留,奇数部分赋给另外一个链表,并返回其头指针
    node *node_divide(node*head1)
    {
        node*head2=(node*)malloc(sizeof(node));
        node *p2=head2,*p=head1,*pre=p->next;
        while(pre){
            if(pre->info%2!=0){
                p->next=pre->next;
                p2->next=pre;
                p2=pre;
            }
            else
            p=pre;
            pre=pre->next;
        }
        p2->next=NULL;
        p->next=NULL;
        return head2;
    }
    //删除链表中大约x不大于y的节点
    void node_dele_XtoY(node*head,int x,int y)
    {
        node*p=head,*pre=p->next,*pmid;
        while(pre){
            pmid=pre->next;
            if(pre->info>x&&pre->info<=y){
                p->next=pre->next;
                free(pre);
            }
            else p=p->next;
            pre=pmid;
        }
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Dynamics CRM9.0更新了Chrome后菜单按钮变形
    质量属性
    机器学习理解
    大道之简的理解
    架构之美理解
    1.13
    1.12
    1.11
    1.10
    Flex 替换输入的字符串
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768524.html
Copyright © 2020-2023  润新知