链表的简单操作

来源:互联网 发布:原始地貌测量数据 编辑:程序博客网 时间:2024/05/22 06:22

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

#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;}
0 0
原创粉丝点击