c - 返回空符号的字符串链表

标签 c

这是我一直在开发的一个程序,最近发布了很多对此感到抱歉的内容,我一直在进步并遇到了错误。该程序允许您将字符串放入链接列表中,然后让您操作该列表。 “ins”可让您将字符串插入列表中,“del”可让您删除这些字符串,“prl”可让您查看列表中的内容。我认为我已经完成了相当多的工作,但是当您在“命令?”之后运行 prl 并且列表中还有项目时,当我希望它显示为我的字符串列表时,它显示为空符号.

例如 命令?嘿嘿 命令?哈哈 命令? prl 嘿 哈哈 命令?德尔·海 命令? prl 哈哈

等等。我希望这已经足够描述了。如果您有任何意见请告诉我,非常感谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN_LENGTH 4
#define MAX_LENGTH 11

struct node{
     char list;
      int count;
       struct node *next;
 };

typedef struct node Node;
typedef Node *ListNode;

void ins(ListNode *ptr, char value);
char del(ListNode *ptr, char value);
char prl(ListNode currPtr);


int main(void){

  ListNode startPtr = NULL;

  char com[MIN_LENGTH]; 
  char cho[MAX_LENGTH]; 

  while(strcmp(com, "end") != 0){
    printf("Command? ");
    scanf("%s", &com);

     if(strcmp(com, "ins") == 0){
       scanf("%s", &cho);
       ins(&startPtr, cho);
       printf("%s\n", cho);

        }

      else if(strcmp(com, "del") == 0){
    scanf("%s", &cho);
    if(del(&startPtr, cho)){
    }
    else{
      printf("%s not found.\n", cho);
    }
      }

      else if(strcmp(com, "prl") == 0){
    prl(startPtr);
       // printf("%s\n", cho);
    }

    else if(strlen(com) >= 4 || strlen(com) < 3){
    printf("You have entered an incorrect command.\n");
    }
  }
}


void ins(ListNode *ptr, char value){

  ListNode newPtr;
  ListNode prevPtr;
  ListNode currPtr;

  newPtr = (struct node*) malloc(sizeof(Node));

    if(newPtr != NULL){
    newPtr->list = value;
    newPtr->next = NULL;

    prevPtr = NULL;
    currPtr = *ptr;

    while(currPtr != NULL && value > currPtr-> list){
      prevPtr = currPtr;
      currPtr = currPtr->next;
    }
    if(prevPtr == NULL){
      newPtr->next = *ptr;
      *ptr = newPtr;
    }
    else{ 
      prevPtr->next = newPtr;
      newPtr->next = currPtr;
    }
   }
    else{
      printf("No memory available\n");
    }
}
char del(ListNode *ptr, char value){
  ListNode prevPtr;
  ListNode currPtr;
  ListNode tempPtr;

  if(value == (*ptr)->list){
    tempPtr = *ptr;
    *ptr = (*ptr)->next;
    free(tempPtr);
    return value;
  }
  else{
    prevPtr = *ptr;
    currPtr = (*ptr)->next;

    while(currPtr != NULL && currPtr->list != value){
      prevPtr = currPtr;
      currPtr = currPtr->next;
    }

    if(currPtr != NULL){
      tempPtr = currPtr;
      prevPtr->next = currPtr->next;
      free(tempPtr);
      return value;
    }
  }
  return '\0';
}

char prl(ListNode currPtr){
  if(currPtr == NULL){
    printf("The List is Empty.\n");
  }else{
    while(currPtr != NULL){
      printf("%c\n", currPtr->list);
      currPtr = currPtr->next;
    }
  }
}

最佳答案

您的 del() 和 ins() 函数使用 char 而不是 char*,也是您的 Node 结构。

请注意我在代码中所做的更改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN_LENGTH 4
#define MAX_LENGTH 11

struct node{
    char list[MAX_LENGTH];
    int count;
    struct node *next;
};

typedef struct node Node;
typedef Node *ListNode;

void ins(ListNode *ptr, char *value);
char* del(ListNode *ptr, char *value);
char prl(ListNode currPtr);


int main(void){

    ListNode startPtr = NULL;

    char com[MIN_LENGTH]; 
    char cho[MAX_LENGTH]; 

    while(strcmp(com, "end") != 0){
        printf("Command? ");
        scanf("%s", &com);

        if(strcmp(com, "ins") == 0){
            scanf("%s", &cho);
            ins(&startPtr, cho);
            printf("%s\n", cho);

        }

        else if(strcmp(com, "del") == 0){
            scanf("%s", &cho);
            if(del(&startPtr, cho)){
            }
            else{
                printf("%s not found.\n", cho);
            }
        }

        else if(strcmp(com, "prl") == 0){
            prl(startPtr);
            // printf("%s\n", cho);
        }

        else if(strlen(com) >= 4 || strlen(com) < 3){
            printf("You have entered an incorrect command.\n");
        }
    }
}


void ins(ListNode *ptr, char *value){

    ListNode newPtr;
    ListNode prevPtr;
    ListNode currPtr;

    newPtr = (ListNode) malloc(sizeof(Node));

    if(newPtr != NULL){
        memset(newPtr, 0, sizeof(Node));
        memcpy(newPtr->list, value, strlen(value));
        newPtr->next = NULL;

        prevPtr = NULL;
        currPtr = *ptr;

        while(currPtr != NULL && value > currPtr-> list){
            prevPtr = currPtr;
            currPtr = currPtr->next;
        }
        if(prevPtr == NULL){
            newPtr->next = *ptr;
            *ptr = newPtr;
        }
        else{ 
            prevPtr->next = newPtr;
            newPtr->next = currPtr;
        }
    }
    else{
        printf("No memory available\n");
    }
}
char* del(ListNode *ptr, char *value){
    ListNode prevPtr;
    ListNode currPtr;
    ListNode tempPtr;

    if(0 == strcmp(value, (*ptr)->list)){
        tempPtr = *ptr;
        *ptr = (*ptr)->next;
        free(tempPtr);
        return value;
    }
    else{
        prevPtr = *ptr;
        currPtr = (*ptr)->next;

        while(currPtr != NULL && 0 != strcmp(value, currPtr->list)){
            prevPtr = currPtr;
            currPtr = currPtr->next;
        }

        if(currPtr != NULL){
            tempPtr = currPtr;
            prevPtr->next = currPtr->next;
            free(tempPtr);
            return value;
        }
    }
    return '\0';
}

char prl(ListNode currPtr){
    if(currPtr == NULL){
        printf("The List is Empty.\n");
    }else{
        while(currPtr != NULL){
            printf("%s\n", currPtr->list);
            currPtr = currPtr->next;
        }
    }
}

关于c - 返回空符号的字符串链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19581210/

相关文章:

c - 在 C (Windows) 中检测 USB 驱动器插入

c - MMAP读写文件

c - C语言编程如何将输入的字符串输出到屏幕上?

C - 将字符复制到字符*

c - 如何组合两个数组以在 C 中创建一个更大的数组

c - 不使用 %f 从 double 转换为 string 的舍入错误

c - scanf 和 printf size_t 变量的正确方法(平台无关)

c - 溢出以更改 C 结构中的下一个元素

c++ - 配置gmp时出错

c - int64_t 的宽度,它总是 64 位吗?