不使用强制转换从指针生成整数

时间:2013-10-25 02:14:19

标签: c

我正在编写一个代码来操作链表。但是它不会编译,因为在第36行我从一个没有强制转换的指针做一个整数。我不确定为什么会这样。但它影响了我的功能“Ins”,它将新角色放入我的列表中。让我知道你的想法。

请忽略函数del,fde,pst,prl,pcr,ppr和psu。我还没有得到那些,他们不应该妨碍。感谢

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

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", cho);

        }

      else if(strcmp(com, "del") == 0){
    // del();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "fde") == 0){
    // fde();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "pst") == 0){
    // pst();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "prl") == 0){
    // prl();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "pcr") == 0){
    // pcr();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "ppr") == 0){
    // ppr();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "psu") == 0){
    // psu();
       scanf("%s", &cho);
       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");
    }
}
void del(){
}
void fde(){
}
void pst(){
}
void prl(){
}
void pcr(){
}
void ppr(){
}
void psu(){
}

3 个答案:

答案 0 :(得分:1)

你有cho作为char数组,你有函数ins接受两个参数,第二个是char。 然后尝试使用第二个参数ins调用函数cho。由于cho是一个char数组,因此其名称被认为等同于指针。因此,您使用第二个参数作为指针调用ins,而该函数需要一个char,它是一个整数类型。您无法合理地期望编译器将该指针转换为该char。

答案 1 :(得分:0)

如果您需要存储字符串,可以在此处阅读:

您需要将结构更改为:

struct node{
     char *list;

然后改变方法:

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

然后更改插入逻辑:

newPtr->list = (char*)malloc(strlen(value)+1); // NOTE: dont forget to free this memory
memcpy(newPtr->list, value, strlen(value)+1);

然后,你有问题:

while(currPtr != NULL && value > currPtr-> list)

我不明白你要在这里比较什么,如果你需要比较字符串 - 在这里使用strcmp而不是>

如果您需要存储个人字符,请在此处阅读:

将插入逻辑更改为:

char *tcho = cho;
while (!*tcho) {
    ins(&startPtr, *tcho);
    tcho++;
}

答案 2 :(得分:0)

声明您的struct节点包含char *,

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

更改ins()函数声明,

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

使用正确的参数调用ins(),

main(void) {
//...
       ins(&startPtr, cho);
//...
}

定义你的ins()函数,为传递的数据字符串分配空间,

void ins(ListNode *ptr, char* value){
//...
    newPtr->list = strdup(value);
//...
}

你在ins()中声明了三个指针,但是典型的单个链表插入只需要两个,一个用于保存新节点,另一个用于保存迭代器以扫描列表的末尾,

    ListNode newPtr;
    ListNode prevPtr; //we will omit this
    ListNode currPtr;

仔细观察后,newPtr是你新分配的列表节点,你是malloc,并检查malloc是否成功(好)。而你似乎使用prevPtr和currPtr作为一种方式来查找列表的末尾(通常称为尾部,而列表的前面通常称为头部)。这是一个可行的解决方案,但您可以简化它。

这是构建新节点的函数,

ListNode NodeNew(char* value)
{
    ListNode newPtr;
    if( (newPtr = (struct node*) malloc(sizeof(Node))) == NULL )
    {
        printf("ENOMEM memory available\n");
        return newPtr=NULL;
    }
    newPtr->list = strdup(value);
    newPtr->next = NULL;
    newPtr->count = 0;
    return newPtr;
}

这是一个更简单的列表插入,

void ins(ListNode *head, char* value)
{
    ListNode newPtr;
    ListNode prevPtr;
    ListNode currPtr;

    if( !(newPtr = NodeNew(value)) )
    {
        return;
    }
    if(*head == NULL)
    {
        *head = newPtr;
    }
    else
    {
        for( currPtr=*ptr; currPtr->next != NULL; )
        {
            currPtr = currPtr->next;
        }
        currPtr->next = newPtr;
    }
}

你想实现list print(prl),

void prl(ListNode head){
    ListNode currPtr;
    for( currPtr=head; currPtr != NULL; )
    {
        printf("n:%s\n",currPtr->list);
        currPtr = currPtr->next;
    }
}