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


#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,并在代码中有任何错误时建议我。 例如: 输入: 5 千米特 金图 斯尼斯特 比特 恩吉特 比特 输出: 千米特 金图 斯尼斯特 恩吉特

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

此外,您还必须使用标准函数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] = '';
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 

相关内容

  • 没有找到相关文章

最新更新