当前位置: 代码迷 >> C语言 >> [求助]链表里的问题请教一下
  详细解决方案

[求助]链表里的问题请教一下

热度:263   发布时间:2006-10-09 21:30:16.0
[求助]链表里的问题请教一下
链表里面的节点有带头节点的链表也有不带头节点的链表,
怎么建立一个带头节点的链表?
怎么建立一个不带头节点的链表?
能给我他们之间的对比程序并说明一下
我在这里先谢大家了
搜索更多相关的解决方案: 表里  

----------------解决方案--------------------------------------------------------

/*不带头结点的*/
#define NULL 0
#include<malloc.h>
#include <stdio.h>
typedef int datatype;

typedef struct link_node{
datatype info;
struct link_node *next;
}node;
typedef node* nodelink;

nodelink buildlink() /* 尾插法*/
{

datatype x;
nodelink head,s;
nodelink p2;
head=NULL;
p2=NULL;
printf("please input the link:");
scanf("%d",&x);
while(x!=0)
{s=(nodelink)malloc(sizeof(node));
s->info=x;
if (head==NULL) head=s; else p2->next=s;
p2=s;
scanf("%d",&x);
}
if(p2) p2->next=NULL;
return(head);
}

nodelink creatlink() /***头插法***/
{ nodelink head,p;
datatype x;
head=NULL;
printf("please input the link:");
scanf("%d",&x);
while(x!=0)
{ p=(nodelink)malloc(sizeof(node)) ;
p->info=x;
p->next=head;
head=p;
scanf("%d",&x);
}
return head;
}



----------------解决方案--------------------------------------------------------

#include<stdio.h>
#define NULL 0
typedef int datatype;

typedef struct hlink{
datatype info;
struct hlink *next;
}node;
typedef node* nodelink;

/* 头插法建立带头节点的单链表*/
nodelink tcreathlink()
{ datatype x;
node *head,*s;
head=(node*)malloc(sizeof(node));
printf("please input the datas:");
scanf("%d",&x);
while(x)
{ s=(node*)malloc(sizeof(node));
s->info=x;
s->next=head->next;
head->next=s;
scanf("%d",&x);
}
return head;
}
nodelink tbuildhlink() /*带头节点的尾插法*/
{

datatype x;
node *head,*s;
node *p2;
head=(node *)malloc(sizeof(node));
p2=head;
printf("please input the datas:");
scanf("%d",&x);
while(x!=0)
{s=(node *)malloc(sizeof(node));
s->info=x;
p2->next=s;
p2=s;
scanf("%d",&x);
}
if(p2) p2->next=NULL;
return(head);
}


----------------解决方案--------------------------------------------------------
我想问版主,是否NULL默认为空指针。
----------------解决方案--------------------------------------------------------
NULL不是空指针.它只是一个数.NULL还要定义的,不过好象头文件已经宏定义过了.为0

空类型指针是这样的.
void *p;



定义一个指针如:int *p=NULL //是初始化.p指向空.(未分配空间)

应该是这样吧.
----------------解决方案--------------------------------------------------------

我想问一下带头节点的在开始时就为他分配连续的内存空间吗?
而不带头节点的就在开始不分配内存空间是这样吗??


----------------解决方案--------------------------------------------------------
谢谢版主给我的这个回答
----------------解决方案--------------------------------------------------------
先明白带头和不带头节点的意思
头指针head不存放数据元素的,一个存放数据元素的指针如果是带头指针链表中的第二个节点,那么它是不带头指针链表的第一个节点

既然带头指针不存放数据元素,带头节点head开始时是没有地址的,它是一个指向指针的指针类型,只有初始化时才为其分配空间

typedef struct Link
{
int data;
struct Link *next;
}Lnode;

//带头节点初始化
void initate(Lnode * *head)
{
*head=(Lnode*)malloc(sizeof(struct Link));
*head->next=NULL;
}

//主函数里
void main()
{
Lnode *head;
initate(&head);//此时头节点才生效,接下来可以分配内存进行插入元素等操作;
Lnode *p==(Lnode*)malloc(sizeof(struct Link));//第二个节点即头指针后插入第一个节点
p->data=10;
p->next=head->next;
head->next=p;
}

//而不带头节点的链表可以直接定义并分配空间与带头节点链表的第二个节点是一样的
//不带头节点的第一个节点为
void main(){
Lnode *p==(Lnode*)malloc(sizeof(struct Link));
p->data=10;
p->next=NULL;

//再插入一个节点
Lnode *q==(Lnode*)malloc(sizeof(struct Link));
q->data=11;
q->next=p->next;
p->next=q;

//当然插入过程应该用循环实现比较方便,偶只是分解一下

}

[此贴子已经被作者于2006-10-10 17:23:26编辑过]


----------------解决方案--------------------------------------------------------

那是
我现在对它有那么一点懂了,自己去在想一应该没什么问题把
谢了
版主的基础不错羡慕啊


----------------解决方案--------------------------------------------------------
  相关解决方案