2013-10-25 55 views
0

这是我一直在努力的一个程序,并且发布了很多最近对此感到抱歉的事情,而且我一直在进步并陷入错误。该程序可让您将字符串放入链接列表中,然后让您操作列表。 “ins”可让您将字符串插入列表中,“del”可让您删除这些字符串,“prl”可让您查看列表中的内容。我想我已经完成了一个体面的工作,但是当你在“Command?”之后运行prl并且列表中还有项目时,它会显示为空符号,当我希望它显示为我的字符串列表时。字符串链接列表返回null符号

例如 命令? ins嘿 命令?大声笑LOL 命令? prl 嘿 Lol 命令? del嘿 命令? prl Lol

等等。我希望这足以描述。如果您有任何意见,请告知我,非常感谢!

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

回答

1

你的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; 
     } 
    } 
} 
+0

这是真棒建议,非常感谢你。 – user2917840