使用C中的链表添加新函数



问题:创建一个包含升序值的链表。然后写入函数addNew(),它将接受来自用户的值,然后调用addBegin()addafterValue()函数将输入值添加到适当的位置

例如,考虑列表如下:12,15,20,26,则如果用户输入值8, 16 & 30,则列表将如下所示:8,12,15,16,20,26,30

我的程序:

#include<stdio.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE;
NODE *start=NULL;
void append()
{
    NODE *temp,*ptr;
    temp=(NODE *)malloc(sizeof(NODE));
    printf("Enter data:");
    scanf("%d",&temp->data);
    temp->next=NULL;
    if(start==NULL)
        start=temp;
    else
    {
        ptr=start;
        while(ptr->next!=NULL)
            ptr=ptr->next;
        ptr->next=temp;
    }
}
void display()
{
    NODE *ptr=start;
    while(ptr!=NULL)
    {
        printf("%dn",ptr->data);
        ptr=ptr->next;
    }
}
void addBegin(int val)
{
    NODE *temp;
    temp=(NODE *)malloc(sizeof(NODE));
    temp->data=val;
    temp->next=start;
    start=temp;
}
unsigned int addAfterValue(int val,NODE *ptr)
{
    NODE *temp;
    temp=(NODE *)malloc(sizeof(NODE));
    temp->data=val;
    temp->next=ptr->next;
    return temp;
}
void addNew()
{
    int val;
    unsigned int loc;
    NODE *ptr=start;
    printf("Enter value to add:");
    scanf("%d",&val);
    if(val<ptr->data) {
        addBegin(val);
        ptr=NULL;
    }
    while(ptr!=NULL) {
        if(ptr->next!=NULL)
        {
            if(val<ptr->next->data)
            {
                addAfterValue(val,ptr);
                ptr->next=loc;
                ptr=NULL;
            }
            else
            {
                ptr=ptr->next;
            }
        }
        if(ptr->next==NULL)
        {
            loc=addAfterValue(val,ptr);
            ptr=NULL;
        }
    }
}
int main()
{
    int ans;
    do
    {
        printf("Enter [1]To appendn[2]To add new noden[3]To displayn[0]To exitn");
        printf("Enter your choice:");
        scanf("%d",&ans);
        switch(ans)
        {
            case 1:
                append();
                break;
            case 2:
                addNew();
                break;
            case 3:
                display();
                break;
            case 0:
                break;
            default:
                printf("Wrong Input.Try again.");
        }
    }while(ans);
}

我的疑问:addBegin()功能运行良好。我认为addafterValue()有问题。有人能帮我找出错误吗?

而不是传递当前指针地址。使用上一个节点指针并将其分配给下一个节点。

void addAfterValue(int val,NODE *ptr)
{
    NODE *temp = (NODE *)malloc(sizeof(NODE));
    temp->data=val;
    temp->next=ptr->next;
    ptr->next = temp;
}

更改addNew函数

void addNew()
{ 
    int val;
    NODE *ptr=start;
    NODE *prev= NULL;
    printf("Enter value to add:");
    scanf("%d",&val);
    if( ptr == NULL || val < ptr->data)
    {
         addBegin(val);
         return;
    }
    else
    {
         prev = ptr;
         ptr=ptr->next;
    }
    while( ptr != NULL)
    { 
            if( val <= ptr->data)
            {
                addAfterValue(val,prev);
                return;
            }
            else
            {
                prev = ptr;
                ptr=ptr->next;
            }
    }
    /* Control comes here if the entire list is scanned.... Now append it to the end using prev pointer, as the new node is greater than all of the existing nodes */
}

相关内容

  • 没有找到相关文章

最新更新