38-1

发布时间 2023-10-05 19:49:29作者: 正确选项

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int data;
    struct node *next;
}LNode,*LinkList;

void CreateList(LinkList &L)    //头插法 
{
    L=NULL;
    int x;
    scanf("%d",&x);
    while(x!=999)
    {
        LNode *lnode=(LinkList)malloc(sizeof(LNode));
        lnode->data=x;
        lnode->next=L;
        L=lnode;
        scanf("%d",&x);
    }
}

void TailCreate(LinkList &L)
{
    L=NULL;
    LNode *p,*r=NULL;//若r=L;指向的都是空指针,不一定是表头指针 
    int x;
    scanf("%d",&x);
    while(x!=999)
    {
        p=(LNode*)malloc(sizeof(LNode));
        p->data=x;
        p->next=NULL;
        if(r==NULL)                    //注意这里!! 
            L=p;
        else
            r->next=p;
        r=p;
        scanf("%d",&x);    
    }    
} 

void Delete(LinkList &L,int x)
{
    if(L==NULL)
        return;
    LNode *s;
    if(L->data==x)
    {
        s=L;
        L=L->next;
        free(s);
        Delete(L,x);
    }
    else
        Delete(L->next,x);
}

void displayList(LinkList L)
{
    LNode *p=L;
    while(p!=NULL)
    {
        printf("%d  ",p->data);
        p=p->next;
    }
}

int main()
{
    LinkList L;
    TailCreate(L);
    displayList(L);
    Delete(L,2);
    printf("\n");
    displayList(L);
    return 0;
}