我正在编写一段代码来操作链表。但它无法编译,因为在第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(){
}发布于 2013-10-25 10:20:21
您将cho作为字符数组,并让函数ins接受两个参数,第二个参数是char。然后,尝试使用第二个参数cho调用函数ins。因为cho是一个字符数组,所以它的名称被认为等同于一个指针。所以调用ins时,第二个参数是一个指针,而该函数需要一个整型的字符。您不能合理地期望编译器将该指针转换为该char。
发布于 2013-10-25 10:30:16
如果你需要存储字符串,你可以在这里阅读:
您需要将您的结构更改为:
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++;
}发布于 2013-10-25 10:37:43
声明你的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;
}
}并且您想要实现列表打印(prl),
void prl(ListNode head){
ListNode currPtr;
for( currPtr=head; currPtr != NULL; )
{
printf("n:%s\n",currPtr->list);
currPtr = currPtr->next;
}
}https://stackoverflow.com/questions/19580023
复制相似问题