实验11 链表 程序2 删除结点

输入若干个正整数(输入-1为结束标志)建立一个单向链表,再输入一个整数m,删除链表中值为m的所有结点。

 
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int data;
struct ListNode *next;
};
 
struct ListNode *Create_list();
struct ListNode *Delete_m(struct ListNode *head, int m );
void print_list( struct ListNode *head)
{
    struct ListNode *p =head;
    while (p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
 
int main(void)
{
    int m;
    printf("连续输入多个整数(-1表示结束):");
    struct ListNode *head =Create_list();
    printf("\n链表的数据: ");
    print_list(head);
    printf("输入要删除的整数:");
    scanf("%d", &m);
    head= Delete_m(head, m);
    print_list(head);
    return 0;
}
 
struct ListNode *Create_list()
{
    struct ListNode *head,*p1,*p2;
    int m;
    int size=sizeof(struct ListNode);
    head=NULL; //这是没有头节点的链表
    //先调用scanf(),再调用malloc()创建了新节点
    while(1)
    {
        scanf("%d", &m);
        if(m == -1) //输入的是-1,退出循环
        {
            break;
        }
        p1=(struct ListNode*)malloc(size);
        p1->data=m;
        p1->next=NULL;
        if(head == NULL)
        {
           head=p1;
        }
        else
        {
           p2->next=p1; //新节点插入链表的尾部
        }
        p2=p1;
    }
    return head;
}
 
struct ListNode *Delete_m( struct ListNode *head, int m )
{
    struct ListNode *ptr, *ptr1;
 
    while( head!=NULL && (head->data == m) )
    {
        ptr1=head;
       head=head->next;
        free(ptr1);
    }
    if( head==NULL )
        return NULL;
    ptr=head;
    ptr1=head->next;
    while(ptr1!=NULL)
    {
        if(ptr1->data==m)
        {
            ptr->next=ptr1->next;
            free(ptr1);
        }
        else
            ptr=ptr1;
        ptr1=ptr->next;
    }
    return head;
}
// 测试结果:
// 连续输入多个整数(-1表示结束):10 10 20 30 10 40 10 10 -1
// 链表的数据: 10 10 20 30 10 40 10 10
// 输入要删除的整数:10
// 20 30 40
posted @ 2018-12-20 20:01  MichaelCecil  阅读(684)  评论(0编辑  收藏  举报