这是我的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct list_node
{
int data;
struct list_node *next;
} node;
node *head,*temp;
int counter;
void display_menu();
char get_choice();
void process(char option);
void Insert_first();
void Print_first();
void Delete_first();
void Delete_end(); // Problem
void Insert_end(); // Problem
void Search();
int main()
{
char choice;
display_menu();
do
{
choice=get_choice();
process(choice);
} while(choice!='J');
return 0;
}
void display_menu()
{
printf("What do you want do do?\n");
printf("A. Insert a node at the beginning of the list\n");;
printf("B. Delete the first node of the list\n");
printf("C. Print list\n");
printf("D. Insert end\n");
printf("E. Delete the last node of the list\n");
printf("F. Search\n");
}
char get_choice()
{
char select;
printf("Enter your choice:\t");
scanf("%c",&select);
getchar();
printf("\n");
return select;
}
void process(char option)
{
switch(option)
{
case 'A': Insert_first();break;
case 'B': Delete_first();break;;
case 'C': Print_first();break;
case 'D': Insert_end();break;
case 'E': Delete_end();break;
case 'F': Search(); break;
default:
printf("Invalid input!\n\n");
}
}
void Search()
{
node *a;
node *b;
int i, j;
a=head;
b=head;
for(i = 1; i < counter - 1; ++i){
a = a -> next;
for(j = i + 1; j < counter; ++j){
b = b -> next;
if((a -> data) == (b -> data)){
printf("0\n");
}
else{
printf("1\n");
}
}
}
counter++;
}
void Insert_first()
{
temp=(node *)malloc(sizeof(node));
printf("Enter a number:\t");
scanf("%d",&(temp->data));
getchar();
printf("\n");
temp->next=head;
head=temp;
counter++;
}
void Insert_end()
{
temp=(node *)malloc(sizeof(node));
node *x;
int y;
printf("Enter a number:\t");
scanf("%d",&(temp->data));
getchar();
printf("\n");
x=head;
for(y = 1; y < counter; ++y){
x=x->next;
}
temp->next=x->next;
x->next = temp;
counter++;
}
void Print_first()
{
if(head==NULL)
{
printf("The list is empty\n");
}
else
{
temp=head;
printf("-------------------------------------------------\n");
do
{
printf("\t%d\t", temp->data);
temp=temp->next;
} while(temp!=NULL);
printf("\n");
printf("-------------------------------------------------\n\n");
}
}
void Delete_first()
{
if(head==NULL)
{
printf("\nThe list is empty\n");
}
else
{
temp=head;
head=temp->next;
free(temp);
counter--;
}
}
void Delete_end()
{
node *x, *z;
int y;
if(head == NULL)
printf("The list is empty");
else{
x=head;
for(y = 1; y < counter; ++y){
x=x->next;
}
z=x;
x=x->next;
free(z);
counter--;
}
}
我有两个问题需要解决:
Delete_end()
功能; Search()
功能。我希望Delete_end()
函数充当Delete_first()
函数,但不是删除FIRST节点并释放其空间,而是它会对END节点执行这些操作。我试图编写这些函数,但它没有返回我想要的函数。
如果我们运行代码,请输入以下内容:
正如您在我删除第一个节点(Switch Choice:B)时注意到的那样,列表来自
--------------------------------
4 3 2
--------------------------------
变为
--------------------------------
3 2
--------------------------------
因此,它删除第一个节点并释放空间。现在,当我删除结束节点(Switch Choice:E)并打印列表(Switch Choice:C)时,列表变为
--------------------------------
3 135704608
--------------------------------
我认为数字135704608是内存中的位置。所以这里发生的事情是它没有删除最后一个节点并取消分配它,而是返回135704608.我希望你能帮助我。
第二个函数是Search()
,如果数字已在列表中,则此函数应返回0,否则返回1 。以下是上述代码中的Search()
函数:
void Search()
{
node *a;
node *b;
int i, j;
a=head;
b=head;
for(i = 1; i < counter - 1; ++i){
a = a -> next;
for(j = i + 1; j < counter; ++j){
b = b -> next;
if((a -> data) == (b -> data)){
printf("0\n");
}
else{
printf("1\n");
}
}
}
counter++;
}
非常感谢任何帮助!
答案 0 :(得分:2)
对于最后删除,您的代码会找到倒数第二个元素并执行此操作:
z=x; // save next to last as z
x=x->next; //set last as x
free(z); // free next to last
相反,我认为你想做更像这样的事情:
free(x->next); // free last elem
x->next = NULL; // next to last now points to NULL, meaning x is now the last element
搜索功能的问题在于您永远不会检查第一个元素!您应该在if
之前执行b = b -> next
比较,然后在内部for循环之后执行a = a -> next
- 否则将永远不会将头部与任何内容进行比较,并且没有任何东西可以与之后的元素进行比较。