C:结构化数据类型 - 链接列表

时间:2013-09-20 13:02:15

标签: c linked-list

这是我的代码:

#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--;
    }
}

我有两个问题需要解决:

  1. Delete_end()功能;
  2. Search()功能。
  3. 我希望Delete_end()函数充当Delete_first()函数,但不是删除FIRST节点并释放其空间,而是它会对END节点执行这些操作。我试图编写这些函数,但它没有返回我想要的函数。

    如果我们运行代码,请输入以下内容:

    Output of the Code

    正如您在我删除第一个节点(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++;
    
    }
    

    非常感谢任何帮助!

1 个答案:

答案 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 - 否则将永远不会将头部与任何内容进行比较,并且没有任何东西可以与之后的元素进行比较。