带头节点的链表

链表的基本操作

#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;
    }
}



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

原文地址:https://www.cnblogs.com/Thereisnospon/p/4768524.html