欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

带头节点的链表

程序员文章站 2022-03-15 17:32:56
...

链表的基本操作

#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\n");
    }
    else{
        while(p){
            printf("%5d",p->info);
            p=p->next;
        }
        printf("\n");
    }
}
//找到第n个节点并返回其指针,若n==0则返回头节点指针
node* node_find(node*head,int n)
{
    int i=0;
    node *p=head;
    if(n<0){
        printf("not\n");
        return NULL;
    }
    else if(n==0){//第零个位置的节点:头节点
        return head;
    }
    while(p&&i<n){//找到第i个节点的地址
        p=p->next;
        i++;
    }
    if(!p)printf("not\n");
    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\n");
    }
    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\n");
    }
    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\n");
        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\n");
        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\n");
    }
    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\n");
}
//倒置链表
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;
    }
}



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