急!在线等,创建链表

zscedu 2011-11-07 02:12:12
有个结构体,里面有几种数据类型,如:int,char等,现在我想把它建成链表(就是把整形的,字符型的都统一成字符数组),怎么创建?这些数据是没有规律的,先谢谢了
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zscedu 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zongzaizuihou 的回复:]
引用 3 楼 zscedu 的回复:
引用 2 楼 dizuo 的回复:
C的话就用void*吧,
struct Node
{
char type[10]; // "int", "char", "float"
void* data; // 数据指针
struct Node* next;
};
根据type提取数据。

C++的话用std::list<boost::any>
……
[/Quote]你这个头插法貌似错了吧?
应该是
node->next = head;
head = node;

zscedu 2011-11-07
  • 打赏
  • 举报
回复


struct type{

char name[32];
struct type *next;


};

struct type* head;
void create_list()
{
char name[32]={0};
struct type *p = NULL,*q = NULL;
int i = 0;
while(i<5){
p =(struct type*)malloc(sizeof(struct type*));
printf("input the data\n");
scanf("%s",name);
strcpy(p->name, name);

p->name[30]='\0';
//p->next = NULL;
if(i==0)
head = p;
else
q->next =p;
q = p;
i++;

}


}
为什么这样的链表建好之后,打印的时候老是报段错误,如果把字符数组改成int就没事
ryfdizuo 2011-11-07
  • 打赏
  • 举报
回复
struct AnyNode
{
char type[10];
void* data;
AnyNode* next;
};

void ListInsert(AnyNode** head, void* data, char* type)
{
AnyNode* node = (AnyNode*)malloc( sizeof(AnyNode) );
node->next = NULL;
node->data = NULL;

memset(node->type, 0, 10);
strcpy(node->type, type);
if ( strcmp(type, "int")==0 )
{
node->data = (int*)malloc(sizeof(int));
*( (int*)node->data ) = *( (int*)data );
}
else if ( strcmp(type, "char")==0 )
{
node->data = (char*)malloc(sizeof(char));
*( (char*)node->data ) = *( (char*)data );
}
node->next = *head;
*head = node;
}

void ListPrint(AnyNode* head)
{
while (head)
{
if ( strcmp(head->type, "int")==0 )
{
printf("%d ,", *( (int*)head->data ));
}
else if ( strcmp(head->type, "char")==0 )
{
printf("%c ,", *( (char*)head->data ));
}
head = head->next;
}

printf("\n");
}
AnyNode* head = NULL;
int ii = 4;
ListInsert(&head, &ii, "int");

char ch = 'a';
ListInsert(&head, &ch, "char");

ListPrint(head);
qq120848369 2011-11-07
  • 打赏
  • 举报
回复
既然会还需要别人给代码.
zongzaizuihou 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zscedu 的回复:]
引用 2 楼 dizuo 的回复:
C的话就用void*吧,
struct Node
{
char type[10]; // "int", "char", "float"
void* data; // 数据指针
struct Node* next;
};
根据type提取数据。

C++的话用std::list<boost::any>
这个结构体我会建,就是链表怎么建?能不能……
[/Quote]

Node *head;
Node *node = malloc(sizeof(Node));
Insert(node, head); //链表的建立是插入的方式,一个一个的插进去

void Insert(Node *node, Node *head) //将node结点 插入到 head这个链表当中,链表调用通常是通过调用头结点。插入方式通常有头插,尾插,还可以控制插入位置,这里只举例头插,其他的靠你自己了
{
node->next = head; //新进的结点指向当前链表的头结点
head = node->next; //将头结点指向新进链表
}
这里是头插,且不带头结点的链表

zongzaizuihou 2011-11-07
  • 打赏
  • 举报
回复
如果你的结构体已定义
比如
typedef struct _tagNidejiegouti
{
int i;
char c;
}Nide;

定义链表
typedef struct _tagList
{
Nide node; //你定义的结构体;
struct _tagList *next; //指向下个这种类型结点的指针;
}NiList;

另一种方法,直接在你定义的结构体内加入指向这种结构体的指针;

typedef struct _tagNidejiegouti
{
int i;
char c;
struct _tagNidejiegouti *next; //在定义好的结构体内增加指向这种结构体类型的指针。
}Nide;


lancerEx 2011-11-07
  • 打赏
  • 举报
回复
开辟一块足够大小的内存区域和指向后一个结点的指针
zscedu 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
C的话就用void*吧,
struct Node
{
char type[10]; // "int", "char", "float"
void* data; // 数据指针
struct Node* next;
};
根据type提取数据。

C++的话用std::list<boost::any>
[/Quote]这个结构体我会建,就是链表怎么建?能不能给个例子
ryfdizuo 2011-11-07
  • 打赏
  • 举报
回复
C的话就用void*吧,
struct Node
{
char type[10]; // "int", "char", "float"
void* data; // 数据指针
struct Node* next;
};
根据type提取数据。

C++的话用std::list<boost::any>
shenchenman 2011-11-07
  • 打赏
  • 举报
回复
全部类型都取指针,然后强转成char*,然后建立你的链表

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧