求助链表的初始化?

yiruirui0507 2010-04-21 01:05:35
带头结点的链表初始化:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char element;
struct node *next;
}LNode,*LinkList;
LNode *Creat()
{
LNode *h,*p,*t;
h=(LinkList)malloc(sizeof(LNode));
h->next=NULL;
t=h;
char ch;
printf("请输入一个字符串,回车结束\n");
while((ch=getchar())!='\n')
{
p=(LinkList)malloc(sizeof(LNode));
p->element=ch;
p->next=NULL;
t->next=p;
t=p;
}
return h;

}
void Show(LinkList h)
{
if(h==NULL) {
printf("链表为空!\n");
}
LNode *p=h->next;
while(p!=NULL)
{
printf("%c",p->element);
p=p->next;
}
}
void main()
{
LinkList h=Creat();
Show(h);
}

上面的我能理解,我想问如何初始化没带头结点的链表呢?听说要用到2级指针?求大家给个简单的例子,让小弟看看眼界!学习学习!最后能在2级指针的使用处给点小提示就最好了!
...全文
147 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangshixue 2010-04-21
  • 打赏
  • 举报
回复
5楼用二级指针就不需要返回值了吧?
赵4老师 2010-04-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
编程-鸟人-_-- 2010-04-21
  • 打赏
  • 举报
回复
使用2级指针是为了给指针分配内存。这就是传值和传址的区别了。如果不用2级指针的话,函数用的指针只是个实参的副本而已,导致指针没有分配到内存空间。

void GetMemory(char * p,int size)//不用二级指针
{
p = (char*) malloc(size);
}

void main()
{
char * pStr=NULL;
GetMemory(pStr,10);//此处调用完,会发现pStr仍为NULL。因为传值造成的。
//不要看见指针就认为传址,那要看操作的数是什么!
}

换成2级指针,问题就解决了!可以自己运行上面例子试试。。。如还不明白,请去看《程序员面试宝典》指针那一章就明白。
周靖峰 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xinzaiyiqi 的回复:]
C/C++ code

InitList(Linklist *L)//Linklist为节点指针类型
{
*L=NULL;//L的值即头指针,初值为NULL
}
[/Quote]
顶4楼
yiruirui0507 2010-04-21
  • 打赏
  • 举报
回复
请问一下大家Linklist L,就是定义了一个指向链表的指针吧?
那Linklist *L 又是什么?是2级指针吗?
typedef struct node{
char element;
struct node *next;
}LNode,*LinkList;

这里已经定义了一个别名,就是说*LinkList 就表示 struct node的类型?

typedef struct node *LinkList;应该是这样定义别名的吧?
Linklist L 其实就是 struct node *L

Linklist *L 其实就是 struct node **L 是个2级指针?
我的分析对吗?
最后一个问题,结点和链表是什么关系?结点是结构体,链表是结点所构成的?感谢大家!
wade_2003 2010-04-21
  • 打赏
  • 举报
回复
我也只能理解你理解的了,2级指针的看5楼吧,呵呵
jernymy 2010-04-21
  • 打赏
  • 举报
回复
顶5楼的
huanmie_09 2010-04-21
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node{
char element;
struct node *next;
} LNode,*LinkList;

LNode *Creat(LNode **h) /*参数为2级指针*/
{
LNode /* *h,*/*p,*t;

int first = 1;
/*
h=(LinkList)malloc(sizeof(LNode));
h->next=NULL;
*/

*h = (LinkList)malloc(sizeof(LNode)); /*创建第一个结点*/
(*h)->next = NULL;

/*t=h;*/

t = *h; /*t指向当前创建链表的尾节点*/
char ch;
printf("请输入一个字符串,回车结束\n");
while((ch=getchar())!='\n')
{
if(first == 1) {
(*h)->element = ch; /*头结点里保存数据*/
first = 0;
continue;
}
p=(LinkList)malloc(sizeof(LNode));
p->element=ch;
p->next=NULL;
t->next=p;
t=p;
}
/*return h;*/
return *h;
}

void Show(LinkList h)
{
if(h==NULL) {
printf("链表为空!\n");
}
/*LNode *p=h->next;*/
LNode *p = h;
while(p!=NULL)
{
printf("%c ",p->element);
p=p->next;
}
}

void main()
{
/*LinkList h=Creat();*/
LinkList h; /*一级指针*/
Creat(&h); /*将一级指针的地址传入*/
Show(h);
}
xinzaiyiqi 2010-04-21
  • 打赏
  • 举报
回复

InitList(Linklist *L)//Linklist为节点指针类型
{
*L=NULL;//L的值即头指针,初值为NULL
}
十八道胡同 2010-04-21
  • 打赏
  • 举报
回复
h=(LinkList)malloc(sizeof(LNode));
h->next=NULL;
t=h;

这个h是头结点
你可以这样
带头结点的链表初始化:
LNode *h,*p,*t;
t=h;
char ch;
printf("请输入一个字符串,回车结束\n");
while((ch=getchar())!='\n')
{
p=(LinkList)malloc(sizeof(LNode));
p->element=ch;
在这里判断h是否是null,是null代表还没有节点,让p作为第一个结点,不是null,就继续
p->next=NULL;
t->next=p;
t=p;
}
yiruirui0507 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lcl_data 的回复:]
没带头结点的链表,你把头结点用了就是了
头结点你可以放数据的啊,有头结点就是放的不是链表的数据,没有头结点的就放数据就是了
[/Quote]

你把头结点用了,那还是带头结点的好吗?
十八道胡同 2010-04-21
  • 打赏
  • 举报
回复
没带头结点的链表,你把头结点用了就是了
头结点你可以放数据的啊,有头结点就是放的不是链表的数据,没有头结点的就放数据就是了

69,373

社区成员

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

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