c程序从给定的链表中删除元素,并在删除后打印整个列表

时间:2017-07-12 14:14:19

标签: c linked-list singly-linked-list

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>

struct Stud
{
    char name[20];
    struct Stud *next;
};

struct Stud *hptr=NULL,*tptr;
//char data[20];


void deleteKey(struct Stud *hptr,char data[20])
{
    struct Stud * temp = hptr, *prev;
    while (temp != NULL && temp->name == data)
    {
        hptr = temp->next;
        free(temp);
        temp = hptr;
    }
    while (temp != NULL)
    {
        while (temp != NULL && temp->name != data)
        {
            prev = temp;
            temp = temp->next;
        }


        if (temp == NULL) return;


        prev->next = temp->next;

        free(temp);


        temp = prev->next;
    }
}




void createList(char *s)
{
    struct Stud *nptr;
    nptr=(struct Stud *)malloc(sizeof(struct Stud));
    strcpy(nptr->name,s);
    if(hptr==NULL)
    hptr=tptr=nptr;
    else
        tptr->next=nptr;
    tptr=nptr;
    nptr->next=NULL;
}


void display(){
    while(hptr!=NULL)   {
        printf("%s ",hptr->name);
        hptr=hptr->next;
    }


}


void main(){
    int i,n;
    char str1[20];
    char s[20];
    scanf("%d",&n);
    for(i = 0; i < n; i++)  {
        scanf("%s",str1);
        createList(str1);
    }
    scanf("%s",s);
    display();
    deleteKey(hptr, s);
    display();
}

我没有得到所需的输出。请在将参数传递给deleteKey时纠正我,并建议我代码中是否有任何错误。         例如:             输入:         五         KMIT         jntu         snist         CBIT         ngit         CBIT         输出:         KMIT         jntu         snist         ngit

1 个答案:

答案 0 :(得分:0)

您必须通过引用将头节点传递给函数,因为它可以在函数内更改。

此外,您必须使用标准函数strcmp来比较字符串。

在此表达式中

temp->name == data

比较两个数组的第一个字符的地址,很明显它们是不相等的。

这是一个演示程序,展示了如何实现该功能。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Stud
{
    char name[20];
    struct Stud *next;
};

int deleteKey( struct Stud **head, const char *name )
{
    while ( *head && strcmp( ( *head )->name, name ) != 0 )
    {
        head = &( *head )->next;
    }

    int success = *head != NULL;

    if ( success )
    {
        struct Stud *node = *head;
        *head = ( *head )->next;
        free( node );
    }

    return success;
}

int push_front( struct Stud **head, const char *name )
{
    struct Stud *node = malloc( sizeof( *node ) );
    int success = node != NULL;

    if ( success )
    {
        strncpy( node->name, name, sizeof( node->name ) );
        node->name[sizeof( node->name ) - 1] = '\0';
        node->next = *head;
        *head = node;
    }

    return success;
}

void display_list( struct Stud **head )
{
    for ( struct Stud *current = *head; current != NULL; current = current->next )
    {
        printf( "%s ", current->name );
    }
}

int main(void) 
{
    struct Stud *head = NULL;

    push_front( &head, "Bob" );
    push_front( &head, "Peter" );
    push_front( &head, "Margarite" );

    display_list( &head );
    putchar( '\n' );

    deleteKey( &head, "Margarite" );

    display_list( &head );
    putchar( '\n' );

    deleteKey( &head, "Bob" );

    display_list( &head );
    putchar( '\n' );

    deleteKey( &head, "Peter" );

    display_list( &head );
    putchar( '\n' );

    return 0;
}

程序输出

Margarite Peter Bob 
Peter Bob 
Peter