【问题标题】:Implementing linked list in C在 C 中实现链表
【发布时间】:2021-12-23 15:47:57
【问题描述】:

我正在尝试在 C 中实现链表,具有创建、插入、删除和显示的选项。 我的代码是:

#include <stdio.h>
#include <conio.h>

void createFirst(int);
void appendNode(int);
void insertFirst(int);
void insertNode(int,int);
void deleteFirst();
void deleteNode(int);
void display();

struct Node
{
    int data;
    struct Node *link;
};

typedef struct Node Node;

Node *start = NULL;
int count=0;

void main()
{
    int ch;
    do
    {
        printf("\f\n");
        printf("1. Create the list \n");
        printf("2. Insert an element at any position \n");
        printf("3. Delete an element at any position \n");
        printf("4. Display the list \n");
        printf("5. Quit \n");
        printf("Enter your choice : \n");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1:
            {
                int a;
                char c;
                printf("Enter the data : \n");
                scanf("%d",&a);
                createFirst(a);
                while(1)
                {
                    printf("Do you want to continue[Y/N] : \n");
                    scanf("  %c",&c);
                    if(c=='Y' || c=='y')
                    {
                        printf("Enter the data : \n");
                        scanf("%d",&a);
                        appendNode(a);
                    }
                    else if(c=='N' || c=='n')
                    {
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                break;
            }
            case 2:
            {
                int a,pos;
                char c;
                printf("Enter the data : \n");
                scanf("%d",&a);
                printf("Enter the position : \n");
                scanf("%d",&pos);
                if(pos == 1)
                {
                    insertFirst(a);
                }
                else
                {
                    insertNode(pos,a);
                }
                while(1)
                {
                    printf("Do you want to continue[Y/N] : ");
                    scanf(" %c",&c);
                    if(c=='N' || c=='n')
                    {
                        break;
                    }
                    if(c!='Y' && c!='y')
                    {
                        continue;
                    }
                    printf("Enter the data : \n");
                    scanf("%d",&a);
                    printf("Enter the position : \n");
                    scanf("%d",&pos);
                    if(pos == 1)
                    {
                        insertFirst(a);
                    }
                    else
                    {
                        insertNode(pos,a);
                    }
                }
                break;
            }
            case 3:
            {
                int pos;
                char c;
                printf("Enter the position : \n");
                scanf("%d",&pos);
                if(pos == 1)
                {
                    deleteFirst();
                }
                else
                {
                    deleteNode(pos);
                }
                while(1)
                {
                    printf("Do you want to continue[Y/N] : ");
                    scanf(" %c",&c);
                    if(c=='N' || c=='n')
                    {
                        break;
                    }
                    if(c!='Y' && c!='y')
                    {
                        continue;
                    }
                    printf("Enter the position : \n");
                    scanf("%d",&pos);
                    if(pos == 1)
                    {
                        deleteFirst();
                    }
                    else
                    {
                        deleteNode(pos);
                    }
                }
                break;
            }
            case 4:
            {
                display();
                break;
            }
            case 5:
            {
                return;
            }
            default:
            {
                printf("Invalid choice \n");
                break;
            }
        }
    }while(ch!=5);
}

void createFirst(int d)
{
    Node newnode = {d,NULL};
    start = &newnode;
    count++;
}

void appendNode(int d)
{
    Node temp = *start;
    while(temp.link != NULL)
    {
        temp = *temp.link;
    }
    Node newnode = {d,NULL};
    temp.link = &newnode;
    count++;
}

void insertFirst(int d)
{
    Node newnode = {d,NULL};
    newnode.link = start;
    start = &newnode;
    count++;
}

void insertNode(int n,int d)
{
    if(n>count || n<count)
    {
        printf("Invalid position \n");
        return;
    }
    Node temp = *start;
    int i;
    for(i=1;i<n-1;i++)
    {
        temp = *temp.link;
    }
    Node newnode = {d,NULL};
    newnode.link = temp.link;
    temp.link = &newnode;
}

void deleteFirst()
{
    if(start != NULL)
    {
        printf("Deleted element : %d \n",(*start).data);
        start = (*start).link;
        count--;
    }
    else
    {
        printf("Underflow \n");
    }
}

void deleteNode(int n)
{
    if(n>count || n<count)
    {
        printf("Invalid position \n");
        return;
    }
    Node temp = *start;
    int i;
    for(i=1;i<n-1;i++)
    {
        temp = *temp.link;
    }
    printf("Deleted node : %d",temp.link->data);
    temp = *(temp.link->link);
    count--;
}

void display()
{
    if(start == NULL)
    {
        printf("The list is empty \n");
        return;
    }
    Node temp = *start;
    int i;
    for(i=1;i<=count;i++)
    {
        printf("%d ",temp.data);
        temp = *temp.link;
    }
}

但是:

  1. 每当控件要附加节点函数时,程序都会以某种方式终止。
  2. 仅创建第一个节点后,如果我去显示,它正在打印一些垃圾值。

请有人帮忙。

【问题讨论】:

  • 第一个问题,您的createFirst 函数会在自动内存中创建一个节点,该节点会在createFirst 退出后立即终止,这意味着start 在此之后不再指向任何内容。您需要为节点提供malloc 内存,以便它在函数调用后持续存在。看起来这是整个代码中的常见问题。
  • 这是标记为 C++,但您所做的概念完全相同:stackoverflow.com/questions/6441218/…
  • 好的。谢谢@yano,我也会试试的。

标签: c struct singly-linked-list


【解决方案1】:

您的问题是在线(appendNode 内部),其中包含:Node temp = *start;。不要那样做。这样做:

Node *temp = start;

更改以下指针符号以适应此更改。就像将点运算符更改为 -&gt; 运算符一样。下面是函数的其余部分:

while(temp->link != NULL)
{
    temp = temp->link;
}
Node *newnode = malloc (sizeof(struct Node));
newnode->data = 0;
newnode->link = NULL;

temp->link = newnode;
count++;

【讨论】:

  • 您介意解释一下您的答案吗?
  • 好的,谢谢@ADBeveridge 我会试试的。
  • 非常感谢@ADBeveridge。真的很有帮助。
  • 非常感谢@yano。真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2018-07-29
相关资源
最近更新 更多