C 在链接列表中添加冗余节点

C 在链接列表中添加冗余节点,c,linked-list,C,Linked List,这是我一直在做的一个项目。此程序允许您将字符串放入链接列表,然后允许您操作列表。ins允许您在列表中插入字符串,del允许您删除这些字符串,prl允许您查看列表中的内容,“pst”允许您查看打印统计信息。我想我已经完成了相当多的工作,但这是我的问题。我希望在节点旁边有一个以上的节点以prl打印 假设您想在列表中输入名称5次: Command? ins name Command? ins name Command? ins name Command? ins name Command? ins n

这是我一直在做的一个项目。此程序允许您将字符串放入链接列表,然后允许您操作列表。ins允许您在列表中插入字符串,del允许您删除这些字符串,prl允许您查看列表中的内容,“pst”允许您查看打印统计信息。我想我已经完成了相当多的工作,但这是我的问题。我希望在节点旁边有一个以上的节点以prl打印

假设您想在列表中输入名称5次:

Command? ins name
Command? ins name
Command? ins name
Command? ins name
Command? ins name
Command? prl
name 1 
name 1
name 1
name 1 
name 1
而不是5个名字1我想说一次名字5, 我在ins函数、主方法和ins的if语句中尝试了一百万个不同的选项。输出似乎没有任何变化。如果您有任何建议或提示,将不胜感激。非常感谢你

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

#define MIN_LENGTH 4
#define MAX_LENGTH 11 //define command length

struct node{
     char list[MAX_LENGTH];
     int count;
       struct node *next;
}; //creates node to be manipulated

typedef struct node Node;
typedef Node *ListNode;

void ins(ListNode *ptr, char *value);
char* del(ListNode *ptr, char *value);
void prl(ListNode currPtr);
void pst(ListNode currPtr);
//function prototype

int count_of_nodes;

int main(void){

  ListNode startPtr = NULL; //sets List to Null value

  char com[MIN_LENGTH]; 
  char cho[MAX_LENGTH]; //declares com and cho to be within the set boundaries

  while(strcmp(com, "end") != 0){
    printf("Command? ");
    scanf("%s", &com);
    //entering 'end' as a command will cause this program to stop,

     if(strcmp(com, "ins") == 0){ 
       scanf("%s", &cho);
        ins(&startPtr, cho);
         count_of_nodes ++;
          printf("%s ", cho);
       printf("%d\n", count_of_nodes);
       //if statement for the insert command, 'ins', corresponds to ins function
       // Adds a string of your choice to the list
     }

      else if(strcmp(com, "del") == 0){
    scanf("%s", &cho);
    if(del(&startPtr, cho)){
      count_of_nodes --;
      printf("%d\n", count_of_nodes);
    }
    else{
      printf("%s not found.\n", cho);
    }
    // if statement for the delete command, 'del'
    //deletes a string of your choice from the list
      }

      else if(strcmp(com, "fde") == 0){
    // fde();
       scanf("%s", &cho);
       printf("%s\n", cho);

     //if statement for the force delete command, 'fde'
     // work in progress, should delete node, regargless of of it's count 
      }

      else if(strcmp(com, "pst") == 0){
    pst(startPtr);

    //if statement for the print stats command, 'pst'
    // allows you to see # of nodes, node with max count
    // node with min count, and average count of nodes
      }

      else if(strcmp(com, "prl") == 0){
    prl(startPtr);

    //if statement for printing the list, 'prl'
    // prints out the list as it is, shows the count of strings 
    }

      else if(strcmp(com, "pcr") == 0){
    // pcr();
       scanf("%s", &cho);
       printf("%s\n", cho);

       //if statement for print count range, 'pcr'
       //work in progress, should print nodes with a count between an interval
       // user chooses interval

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

       //if statement for print prefix, 'ppr'
       //work in progress, should add count to node by entering node prefix
    }
      else if(strcmp(com, "psu") == 0){
    // psu();
       scanf("%s", &cho);
       printf("%s\n", cho);

       //if statement for print suffix, 'psu'
       //work in progress, should add count to node by entering node suffix
    }

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


void ins(ListNode *ptr, char *value){
  //insert function

  ListNode newPtr;
  ListNode prevPtr;
  ListNode currPtr;
  //variables used in insert

  newPtr = (ListNode) malloc(sizeof(Node));
  //make space in the list for new node

    if(newPtr != NULL){
      if (strcmp(value, newPtr->list) == 0){
    newPtr->count++;
      } //trouble area, trying to figure out how to add to count
      else{
      memset(newPtr, 0, sizeof(Node));
      memcpy(newPtr-> list, value,strlen(value));
      //puts value into node

      newPtr->count++;
      }
      //  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");
    }//bug checks
}
char* del(ListNode *ptr, char *value){
  //delete function

  ListNode prevPtr;
  ListNode currPtr;
  ListNode tempPtr;
  //variables used in delete

  // if(value == (*ptr)->list){
  if(0 == strcmp(value, (*ptr)->list)){
    tempPtr = *ptr;
    *ptr = (*ptr)->next;
    free(tempPtr); //fress 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';
}

void fde(){
} //work in progress, disregard

void pst(ListNode currPtr){
  //print stats function

  int total;
  float avg;
  ListNode maxP;
  ListNode minP;
  ListNode temp;
  //variables used in print stats

  if (currPtr == NULL){
    printf("The list is empty.\n"); //bug checks
  }
  else{
    temp = maxP = minP = currPtr;


  while (temp != NULL)
    {
      if (temp->count > maxP->count)
    {
      maxP = temp; //finds max value of count
    }
      else if (temp->count < minP->count)
    {
      minP = temp; //finds min value of count
    }
      total = total + temp->count;
      temp = temp->next;
    }

  }
  avg = total / (float)count_of_nodes; //finds average for node counts

  printf("Total of nodes: %d\n", count_of_nodes);
   printf("Max: %d\n", maxP->count);
     printf("Min: %d\n", minP->count);
      printf("Average: %f\n", avg);
      //prints for function
}

void prl(ListNode currPtr){

  if(currPtr == NULL){
    printf("The List is Empty.\n"); //bug checks

   }else{
     while(currPtr != NULL){    //loops through list and prints all nodes inside
       printf("%s " , currPtr->list); 
       printf("%d\n", currPtr->count);
        currPtr = currPtr->next;    
    }
   }
}

void pcr(){
} //work in progress, disregard
void ppr(){
} //work in progress, disregard
void psu(){
} //work in progress, disregard

我可以在分配新节点之前添加一个循环吗 搜索列表并查找匹配节点的

是的,你可以。我建议将这个循环放在一个也可以在del中使用的函数中


在ins中,可以立即为新节点分配内存。您应该遍历现有列表并查找具有匹配名称的节点。如果已经存在,则增加计数。如果没有,则创建一个新节点。我是否可以在分配新节点之前添加一个循环,一个搜索列表并查找匹配节点的循环?
// search list '**ptr' in ascending order for string 'value'
// return 0 if string found in list, '*ptr' points to pointer to string's node
//       >0 if not found and '*ptr' points to node pointer where to insert
//       -1 if not found and '*ptr' points to null pointer where to append
int search(ListNode **ptr, char *value)
{
    ListNode currPtr;
    for (; currPtr = **ptr; *ptr = &currPtr->next)
    {
        int cmp = strcmp(currPtr->list, value);
        if (0 <= cmp) return cmp;
    }
    return -1;
}

void ins(ListNode *ptr, char *value)
{   //insert function
    if (search(&ptr, value) == 0)
        (*ptr)->count++;
    else
    {   //make space in the list for new node
        ListNode newPtr = malloc(sizeof(Node));
        if (newPtr == NULL)
        {  
            printf("No memory available\n");
            return;
        }

        strncpy(newPtr->list, value, sizeof newPtr->list);
        newPtr->count = 1;
        newPtr->next = *ptr;
        *ptr = newPtr;
    }
}