C语言 在链表中添加冗余节点



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

假设您想在列表中输入 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函数,我的main方法和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("%dn", 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("%dn", 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("%sn", 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("%sn", 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("%sn", 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("%sn", 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 availablen");
    }//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 '';
}
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: %dn", count_of_nodes);
   printf("Max: %dn", maxP->count);
     printf("Min: %dn", minP->count);
      printf("Average: %fn", 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("%dn", currPtr->count);
        currPtr = currPtr->next;    
    }
   }
}
void pcr(){
} //work in progress, disregard
void ppr(){
} //work in progress, disregard
void psu(){
} //work in progress, disregard

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

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

// 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 availablen");
            return;
        }
        strncpy(newPtr->list, value, sizeof newPtr->list);
        newPtr->count = 1;
        newPtr->next = *ptr;
        *ptr = newPtr;
    }
}

相关内容

  • 没有找到相关文章

最新更新