链表的简单操作

链表的简单操作大致包括:头插法尾插法建立链表,遍历链表,删除添加结点。

#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Node;
void print(Node *head)          .//遍历链表
{
    Node *p;
    p = head;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
    return ;
}
Node *create_linklist(int n)                //头插法建立链表
{
    int i;
    int d;
    Node *head = NULL,*p;
    for(i = 0; i < n; i ++)                      //将新结点插到开头的位置
    {
        scanf("%d",&d);
        p=(Node *)malloc(sizeof(Node));
        p->data = d;
        p->next = NULL;
        if(head == NULL)
            head = p;
        else
        {
            p->next = head;
            head = p;
        }
    }
    return head;
}
/*Node *create_linklist(int n)  //创建链表 ,尾插法
{
    Node *head = NULL;
    Node *p,*last;
    int d;
    int i;
    for(i=0; i<n; i++)
    {
        scanf("%d",&d);
        p = (Node *)malloc(sizeof(Node));
        p->data = d;
        p->next = NULL;
        if(head == NULL)
            head = p;
        else
            last->next = p;
        last= p;
    }
    return head;
}*/
Node *insert_node(Node *head,int b) //插入大小为b的结点
{
    Node *pre1 = head,*pre2,*p;
    p = (Node *)malloc(sizeof(Node));
    p->data = b;
    if(head == NULL)
    {
        head = p;
        p->next = NULL;
    }
    else if(p->data < head->data)
    {
        head = p;
        p->next = pre1;
    }
    else
    {
        while(pre1 != NULL && p->data >= pre1->data)
        {
            pre2 = pre1;
            pre1 = pre1->next;
        }
        p->next = pre1;
        pre2->next = p;
    }
    return head;
}
Node *delete_node(Node *head ,int b)    //删除元素为b的结点
{
    Node *p,*pre;
    p = head;
    if(head == NULL)
        printf("List is null,delete failed.\n");
    else
    {
        while(b != p->data && p->next != NULL)
        {
            pre = p;
            p = p->next;
        }
        if(b == p->data)
        {
            if(p == head)
                head = p->next;
            else
                pre->next = p->next;
            free(p);
        }
        else
            printf("%d not found,delete fail.\n",b);
    }
    return head;
}

Node *delete_n_node(Node *head,int n)   //删除第N个结点
{
    int i = 1;
    Node *p,*pre;
    p = head;
    if(head == NULL)
        printf("List is null,delete failed.\n");
    else if(n==1)
    {
        head == head->next;
    }
    else
    {
        while(p->next != NULL)
        {
            i++;
            pre = p;
            p = p->next;
            if(i == n)
                break;
        }
        if(p ->next == NULL)
            printf("there is less than %d.\n",n);
        else
            pre->next = p->next;
        free(p);
    }
    return head;
}
Node *insert_n_node(Node *head, int n)  //在第N个结点后面插入一个结点
{
    int b;
    int i = 0;
    Node *pre2,*pre1 = head,*p;
    p = (Node *)malloc(sizeof(Node));
    scanf("%d",&b);
    p->data = b;
    p->next = NULL;
    if(n == 0)
    {
        head = p;
        p->next = pre1;
    }
    else
    {
        while(pre1 != NULL && i != n)
        {
            pre2 = pre1;
            pre1 = pre1->next;
            i++;
        }
        if(i == n)
        {
            p->next = pre2->next;
            pre2->next = p;
        }
        else
            printf("NULL\n");
    }
    return head;

}
int main()
{
    int n,b;
    Node *head = NULL;

    scanf("%d",&n);
    head = create_linklist(n);
    print(head);

    scanf("%d",&b);
    head = delete_node(head,b);
    print(head);

    scanf("%d",&b);
    head = insert_node(head,b);
    print(head);

    scanf("%d",&n);
    head = delete_n_node(head,n);
    print(head);

    scanf("%d",&n);
    head = insert_n_node(head,n);
    print(head);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值