2013-10-25 57 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