c语言指针链表
① 问下c语言链表的问题 前面结构体里定义的指针和函数里定义的结构体指针有什么不同,看了n久了,还是看
以下代码是一个链表的逆置操作代码,供参考
#include<stdio.h>
#include<stdlib.h>
structnode{
intn;//结点中的数据
structnode*next;//指向后继结点的指针
}*list=NULL;//表头,初值NULL,表示空表
voidcreateList()//建立链表
{
structnode*p;//临时结点指针
inti;
for(i=5;i>0;i--)
{
p=(structnode*)malloc(sizeof(structnode));//申请一个结点
p->n=i;//数据赋值
//以下两句,实现头插法建立链表
p->next=list;//把新结点p装在表头前
list=p;//p成为新的表头
}
}
voidshowList()
{
structnode*p=list;
while(p)
{
printf("%d",p->n);
p=p->next;
}
printf(" ");
}
voidreverseList()
{
structnode*p=NULL,*h=list,*t;
while(h)
{
t=h;//分离出一个结点
h=h->next;//h指向后续的部分,保持原表不丢失
t->next=p;//头插法
p=t;
}
list=p;//表头指针赋值
}
intmain()
{
printf("link: ");
createList();//建表
showList();//显示表
reverseList();//逆置
showList();//再显示
return0;
}
② C语言中:链表中的指针与指针域的区别
这是两个不同的概念。
1
指针是C语言中的一个数据类型。在链表的节点中,可能包含多个指针。
2
指针域是指的链表中用来指向相关节点的指针,一般是下一个,对于双向链表,也包括指向上一个的指针。
3
对于链表节点,可以分为数据域和指针域两部分。数据域中可能包含有指针类型。指针域中必然是指针类型。
③ C语言 链表 指针问题
1、删除指针,并不会释放他指向的内存地址。
2、如果你指向的地址还需要用,为什么要删除其指针。同一个地址可以有多个指针。
你可以在结构里定义2个链表指针,分别是正向和反向,这样你输入的的时候,就直接得到正反两个链表了。我写了案例,你参考吧。
#include<stdio.h>
#include<malloc.h>
#definesize5//你想输入的链表个数
typedefstructstt
{
charnum;
structstt*next0;//正向链表指针
structstt*next1;//反向链表指针
}STT;
STT**creatSTT();//创建一条链表,返回其正向链表首节点及尾节点组成的指针数组
voidprintSTT(STT*sttHead,intflag);//打印链表,flag=0打印正向链表,flag=1打印反向链表
intmain()
{
intn=size,i;
STT*sttHead=(STT*)malloc(sizeof(STT)),*stt0[n],*stt1[n],**stts=NULL;
for(i=0;i<n;i++)
{
stts=creatSTT();
stt0[i]=stts[0];//这就是你想要得到的正向链表首指针数组
stt1[i]=stts[1];//这就是你想要得到的反向链表首指针数组
}
printf("输入的所有链表为
");
for(i=0;i<size;i++)
{
sttHead->next0=stt0[i];
printSTT(sttHead,0);
}
printf("所有反转链表为
");
for(i=0;i<size;i++)
{
sttHead->next1=stt1[i];
printSTT(sttHead,1);
}
return0;
}
STT**creatSTT()
{
charnum;
STT*stt0=NULL,*sttTail=NULL,*sttNew=NULL,**stts;
stts=(STT**)malloc(sizeof(STT*)*2);//存放首尾节点的指针数组
printf("请连续输入一串数字组成链表:(非数字字符将被过滤)
->");
while(1)
{
num=getchar();
if(num>='0'&&num<='9')
{
sttNew=(STT*)malloc(sizeof(STT));
sttNew->num=num;
sttNew->next0=NULL;
sttNew->next1=NULL;
if(stt0==NULL)
stt0=sttNew;
else
{
sttTail->next0=sttNew;//连接正向链表指针
sttNew->next1=sttTail;//连接反向链表指针
}
sttTail=sttNew;
}
if(num=='
')
break;
}
stts[0]=stt0;
stts[1]=sttTail;
returnstts;
}
voidprintSTT(STT*sttHead,intflag)
{
if(flag==0)
{
while(sttHead->next0)
{
printf("%c",sttHead->next0->num);
sttHead=sttHead->next0;
}
printf("
");
}
else
{
while(sttHead->next1)
{
printf("%c",sttHead->next1->num);
sttHead=sttHead->next1;
}
printf("
");
}
}