单向链表的删除、逆置和释放

好程序员训练营

<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>

------我的c语言笔记,期待与您交流! 


#include<stdio.h>

#include<stdlib.h>


typedef struct list_t{

    int value;

    struct list_t *next;

}node;

 

node *creat();  //建立单向链表

node *del(node *head,int num); //单链表删除节点

node *reverse(node *head); //单链表逆置

void free_p(node *head); //释放链表分配的空间

 

int main()

{

    node *head = 0;   //有时候记得要初始化指针

    head = creat();

    print(head);

    printf("\n");

    free_p(head);

    print(head);

}


node *creat()

{

    node *head, *p, *s;

    int x, cycle = 1;

    head = (node*)malloc(sizeof(node));

    p = head;

    while (cycle)

    {

        printf("please input the data : ");

        scanf_s("%d\n", &x);

        if (x != 0)        //链表以0结尾

        {

            s = (node*)malloc(sizeof(node));

            s->value = x;

            printf("%d\n", s->value);

            p->next = s;

            p = s;

         }

        else cycle = 0;

    }

    head = head->next;

    p->next = NULL;

    return head;

}

 

int length(node *head)

{

    int n=0;

node *p;

p=head;

while(p!=NULL)

{

   p=p->next;

   n++;

     }

   return(n);

}


 node *del(node *head, int num)

{

    node *p1, *p2=0;

    p1 = head;

    while (num != p1->value && p1->next != NULL)

    {

        p2 = p1;

        p1 = p1->next;

    }

    if (num == p1->value)

        if (p1==head)

        {

            head = p1->next;

            free(p1);

        }

        else

       {

            p2->next = p1->next;

       }

    else

        printf("\n %d could not be found", num);

        return head;

}

 

node *reverse(node *head)

{

    if (head == NULL || head->next == NULL)

    {

        return head;

     }

    node *reversehead = NULL;

    node *p_curr = head;

    node *p_prev = NULL;

    while (p_curr != NULL)

    {

       node *p_next = p_curr->next;

       if (p_curr == NULL)

       reversehead = p_curr;

       p_curr->next = p_prev;

       p_prev = p_curr;

       p_curr = p_next;

    }

   reversehead = p_prev;

   return reversehead;

}


void print(node *head)

{

    node *p;

    p = head;

    while (p != NULL)

    {

         printf("%d", p->value);

         p = p->next;

    }

}

 

voifree_p(node *head)

{

    node *p, *next;

    p = head;

    while (p != NULL)

    {

        next = p->next;

        free(p);

        p = next;

    }

}


你可能感兴趣的:(数据结构,单向链表,逆置)