在(C)中扫描新节点时,按字母顺序对链表进行排序



我已经连续一周在做这个项目了,它将于今晚午夜到期。我是一名计算机科学大一学生,刚开始编程,所以我看不出这段代码有什么问题。代码应该将事件标题、事件时间和事件日期读入链表中,并使用事件标题按字母顺序进行排序。

这是来自文件的输入:

生日12 302018年1月10日婚礼06 302018年6月15日研讨课05 002019年2月15日生日04 002018年6月15日周年纪念日08 302019年9月12日

由于某种原因,它从未将婚礼活动连接到链表,而且在打印整个链表时,有一个空白节点作为头节点。我一直在研究这个问题,即使在追踪代码时,我也无法找出问题所在。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//struct for event time
typedef struct{
int hour;
int minute;
} event_time_t;
//struct for event date
typedef struct{
int month;
int day;
int year;
} event_date_t;
//struct for all event info
struct event{
char event_title[20];
event_time_t event_time;
event_date_t event_date;
struct event *next;
};
typedef struct event event_t;
void add_events (event_t **head_ptr);
void print_event(event_t *head_ptr);
void print_slected_event (event_t *head_ptr, int month, int day, int year);
int main () {
event_t *head_ptr = malloc(sizeof(event_t));
add_events(&head_ptr);
print_event(head_ptr);
print_slected_event(head_ptr,6,15,2018);
return 0;
}
void add_events (event_t **head_ptr){
event_t *temp;
event_t *temp_head = *head_ptr;
event_t *new_node;
scanf(" %s",temp_head->event_title);
scanf("%d",&temp_head->event_time.hour);
scanf("%d",&temp_head->event_time.minute);
scanf("%d",&temp_head->event_date.month);
scanf("%d",&temp_head->event_date.day);
scanf("%d",&temp_head->event_date.year);
temp_head->next = NULL;
while(!feof(stdin)){
new_node = malloc(sizeof(event_t));
scanf(" %s",new_node->event_title);
scanf("%d",&new_node->event_time.hour);
scanf("%d",&new_node->event_time.minute);
scanf("%d",&new_node->event_date.month);
scanf("%d",&new_node->event_date.day);
scanf("%d",&new_node->event_date.year);

if(temp_head->next == NULL){
temp_head->next = new_node;
}
else if(strcmp(temp_head->event_title,new_node->event_title)>0){
new_node->next = temp_head;
temp_head = new_node;
*head_ptr = temp_head;
}
else{
temp = temp_head;
while(temp->next!=NULL){
if(strcmp(temp->event_title,new_node->event_title)==0){
break;
}
if(strcmp(temp->event_title,new_node->event_title)<0){
break;
}
temp = temp->next;
}

new_node->next = temp->next;
temp->next = new_node;

}

}
}
void print_event(event_t *head_ptr){
event_t *temp;
temp = malloc(sizeof(event_t));
temp = head_ptr;
printf("Scedule of Events:n");
while(temp->next!=NULL){
printf("t%-13s at: %02d:%02d ",temp->event_title,temp->event_time.hour,temp->event_time.minute);
printf("on: %02d/%02d/%dn",temp->event_date.month,temp->event_date.day,temp->event_date.year);
temp = temp->next;
}
}
void print_slected_event (event_t *head_ptr, int month, int day, int year){
event_t *temp;
temp = malloc(sizeof(event_t));
temp = head_ptr;
printf("Date: %02d/%02d/%dn",month,day,year);
printf("Events:n");
while(temp->next!=NULL){
if(temp->event_date.month == month){
if(temp->event_date.day == day){
if(temp->event_date.year == year){
printf("t%-13s at: %02d:%02dn",temp->event_title,temp->event_time.hour,temp->event_time.minute);
}
}
}
temp = temp->next;
}
}
在列表中插入节点的函数应与从文件中读取数据或用数据填充结构的代码分开。

我可以提出以下方法。

//struct for event time
typedef struct{
int hour;
int minute;
} event_time_t;
//struct for event date
typedef struct{
int month;
int day;
int year;
} event_date_t;
//struct for all event info
typedef struct{
char event_title[20];
event_time_t event_time;
event_date_t event_date;
} event_t;
//struct for node of the list
typedef struct node
{
event_t event;
struct node *next;
} node_t;
//struct for the list itself
typedef struct
{
node_t *head;
} list_t;

在这种情况下,在列表中插入节点的函数可以按照以下方式

int add_event( list_t *list, event_t *event )
{
node_t **current = &list->head;
while ( *current != NULL && !( strcmp( event->event_title, ( *current )->event.event_title ) < 0 ) )
{
current = &( *current )->next;
}
node_t *new_node = malloc( sizeof( node_t ) );
int success = new_node != NULL;
if ( success )
{
new_node->event = *event;
new_node->next = *current;
*current = new_node;
}
return success;
}

总的来说,你只需要声明一个类似的列表

list_t list = { .head = NULL };

当您可以编写从文件读取数据、填充结构事件并调用函数add_event的函数时,该函数会传递一个指向列表的指针和一个指向已填充结构的指针。

这是一个简化的演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//struct for event time
typedef struct{
int hour;
int minute;
} event_time_t;
//struct for event date
typedef struct{
int month;
int day;
int year;
} event_date_t;
//struct for all event info
typedef struct{
char event_title[20];
event_time_t event_time;
event_date_t event_date;
} event_t;
//struct for node of the list
typedef struct node
{
event_t event;
struct node *next;
} node_t;
//struct for the list itself
typedef struct
{
node_t *head;
} list_t;
int add_event( list_t *list, event_t *event )
{
node_t **current = &list->head;
while ( *current != NULL && !( strcmp( event->event_title, ( *current )->event.event_title ) < 0 ) )
{
current = &( *current )->next;
}
node_t *new_node = malloc( sizeof( node_t ) );
int success = new_node != NULL;
if ( success )
{
new_node->event = *event;
new_node->next = *current;
*current = new_node;
}
return success;
}
void print_list( const list_t *list )
{
for ( const node_t *current = list->head; current != NULL; current = current->next )
{
printf( "%s -> ", current->event.event_title );
}
puts( "null" );
}
int main(void) 
{
list_t list = { .head = NULL };
event_t event = { "third", { 0 }, { 0 } };
add_event( &list, &event );
print_list( &list );
strcpy( event.event_title, "first" );
add_event( &list, &event );
print_list( &list );
strcpy( event.event_title, "second" );
add_event( &list, &event );
print_list( &list );
return 0;
}

程序输出为

third -> null
first -> third -> null
first -> second -> third -> null

这是开发项目的起点。

最新更新