c - C 中的菜单驱动程序对链表执行各种操作

标签 c function linked-list

以下代码适用于除 deleteEnd 函数之外的所有函数。当我执行程序时,所有函数都执行它们应该执行的任务,但 deleteEnd 函数不执行任何操作。执行deleteEnd函数时链表没有变化。请帮忙!!!

#include<stdio.h>
#include<conio.h>
struct node{
   int data;
   struct node *link;
}*head = NULL, *new_node, *ptr=NULL, *prev_ptr, *temp;

void insertBeg(){
    int info;
    new_node = (struct node*)malloc(sizeof(struct node));
    printf("\nEnter data : ");
    scanf("%d",&info);
    new_node->data=info;
    new_node->link=NULL;
        if(head==NULL){
            head=new_node;
        }
        else{
            new_node->link=head;
            head=new_node;
        }
}

void insertEnd(){
    int info;
    new_node = (struct node*)malloc(sizeof(struct node));
    printf("\nEnter data : ");
    scanf("%d",&info);
    new_node->data=info;
    if(head==NULL){
        head=new_node;
        new_node->link=NULL;
    }
    else{
        prev_ptr=head;
        ptr=head->link;
        while(ptr!=NULL){
            prev_ptr=ptr;
            ptr=ptr->link;
        }
        prev_ptr->link=new_node;
        new_node->link=NULL;
    }
}

void displayNode(){
    printf("\nLinked List is : ");
    ptr=head;
    while(ptr!=NULL){
        printf("%d--->",ptr->data);
        ptr=ptr->link;
    }
}

void deleteBeg(){
    if(head==NULL){
        printf("\nUnderflow");
    }
    else{
        temp=head;
        head=head->link;
        free(temp);
    }
}

void deleteEnd(){
    if(head==NULL){
        printf("\nUnderflow");
    }
    else{
        prev_ptr=head;
        ptr=head->link;
        while(ptr!=NULL){
            prev_ptr=ptr;
            ptr=ptr->link;
        }
        prev_ptr->link=NULL;
        free(ptr);
    }
}

void traverse(){
    int count=0;
    ptr=head;
    while(ptr!=NULL){
        ptr=ptr->link;
        count++;
    }
    printf("\nNumber of elements in the list are : %d",count);
}

void main(){
    int choice,ch='y';
    clrscr();
    label:
    printf("\nPress 1 to insert at beg\n2 to insert at end");
    printf("\n3 to delete from beg\n4 to delete from end");
    printf("\n5 to display the list\n6 to traverse the linked list : ");
    scanf("%d",&choice);
    switch(choice){
        case 1: insertBeg();
            break;
        case 2: insertEnd();
            break;
        case 3: deleteBeg();
            break;
        case 4: deleteEnd();
            break;
        case 5: displayNode();
            break;
        case 6: traverse();
            break;
        default: printf("\nInvalid Option");
    }
    printf("\nPress y to continue or any other key to exit : ");
    scanf("%s",&ch);
    if(ch=='y' || ch=='Y'){
        goto label;
    }
    getch();
}

最佳答案

循环

while(ptr!=NULL){

运行直到ptrNULL,这意味着后面的调用free(ptr)无效。

您可以通过更快地退出循环一次迭代来解决此问题

void deleteEnd(){
    if(head==NULL){
        printf("\nUnderflow");
    }
    else{
        prev_ptr=head;
        ptr=head;
        while(ptr->link!=NULL){
            prev_ptr=ptr;
            ptr=ptr->link;
        }
        prev_ptr->link=NULL;
        free(ptr);
    }
}

您可能需要考虑对结束元素是 head 的情况进行特殊处理来扩展它

关于c - C 中的菜单驱动程序对链表执行各种操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21364493/

相关文章:

c - 当我多次运行我的程序(用 C 语言)时,它总是选择相同的随机数

c - 为什么我在使用 fgets 时必须输入 EOF 3 次?

C无法使用变量打开文件

c++ - 在 C++ 上使用递归函数计算幂

java - 错误 - 从 Java 调用 Oracle 函数

javascript - 函数参数未声明变量中的 TDZ

c++ - 在 C++ 中通过引用传递对象

c - 位图字体渲染问题

java - 对 Java LinkedList 的较低级别访问?

java - 如何从堆栈中删除某些项目