链表c语言单向
① c语言单向链表的问题
上面这位老兄丛配胡有点遗漏,我补充一下:
1、pr=p=(struct
node*)malloc(sizeof(struct
node));
这行的pr指针为什么要再指向p呢,我想是想象我下面更改后的代码里if块里面要执行的第二条语句,实际上两种写法的执行效果截然不同!
去掉pr=,因为它只是一个偏移指针,不需要真实分配内存给它。在下面的语句中,它是随着结点的插入而移动的!当链表插入第一个后pr必须指向head指向的内存块。
2、代码编写有误导致无法连接下面的结点,一下代码缺少括号:
f(head==NULL)
/*判断是否为第一个结点*/
head=p;
/*使指向第一个结点*/
else
pr->next=p;
/*连接结点*/
pr=p;
//应该加上括号,否则你上面的else代码只会执行第一句,而pr=p却总是无用地被执行。
if(head==NULL)
/卖销*判断是否为第一个结点*/
{
head=p;
/*使指向第一个结点*/
pr
=
p;
//pr
指针也应该指向开头的第一个结点。
}
else
{
pr->next=p;
/*连接结点*/
pr=p;
//插入第二个结点后,pr指向第二个结点,插入第三个结点时,pr指向第三个结点,类推.....
}
建议出这样的错误的时候使用调试工具单步调试。细小的错误就会露渗拦出马脚来了!
② C语言 单向链表的头结点问题
1.头结点是单向链表的第塌祥一个结点,一般设一个指向头结点的指针,团碧搏头结点一般存放链表的长度信息,如果有其他需要也可以存放其他信息,看你的需求了。
2.如果你的链表第一个结点没有慧袜存放链表信息而是存放了实际的数据,那么就是说你的链表是不带头结点的链表
实际上带不带头结点的链表都是可以使用的,看你的喜好了。呵呵!
③ 用C语言编程(创建一个单向链表)
*creat a list*/
#include "stdlib.h"
#include "stdio.h"
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please input 5 numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4) ptr->next=NULL;
else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数顷派绝据,并且存有下一个数据的指针,这样一个雀姿指一个形成一个数据链。这个数据链可以被操作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和羡返指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表
④ C语言单向链表问题。
printf(“->%d”,p->data)这是模轮是字符串而已。
比如:p->data的值为14。那么执行printf(“->%d”,p->data)后,卖码慎显示:->14。
比如:这个p链表数据为:中敬1,2,3,4,那么执行完这个循环后,显示为:->1->2->3->4
这样是为了显示好看罢了。
⑤ C语言中如何实获取单向链表的头指针
首先你的问题有点小小的误解,头指针意思为指向链表头结点的一个指针,你必须自己定义一个链表结点类型的指针,并指向那个链表的头结点就可以了~何来获取一说,因为本身就是你自己定义的~。
你的问题应该是如何获取单项链表的头结点。常见的解决方案共有以下几种:
1.声明链表后,马上定义一个头指针,指向链表的头结点,这样,不管程序运行到哪儿,都可以通过访问头指针来得到头结点。
2.定义单独的头结点,不赋槐念值,永远只作为类似标志的性质,以后通过它访问整个链表铅拍困,即链表第一个结点为头结点->Next。
3.将贺塌单向链表制作为循环链表,在头结点设置特殊值,永远往一个方向找,一旦找到特殊值,即为找到头结点。
⑥ C语言单向链表
用指针链表主要是灵活,不受元素个数限制,用数组可以达到同样的效果,在结构成员里加一个指向下一个元素的下标变量就行,缺点是元素数量不能超过数组定源基义的最大长度,除非数组也是动态分配空间纳型,每次重新分配空间时,还要将原来数组里的内容复制到到新分配的数组中,并且从数组雹茄谨中删除一个元素时,会出现碎片,如果想利用这些碎片,每次都得遍历一遍数组,用指针链表删除一个元素就简单多了。
⑦ C语言数据结构 如何建立单向循环链表并且输入值
#include<iostream>
usingnamespacestd;
typedefcharElemType;
typedefintStatus;
#defineOK1
#defineERROR0
typedefstructLnode
{
ElemTypedata;
structLnode*next;
}Lnode,*LinkList;
voidCreat_List(LinkListL)//创建单链表并输入元素
{
LinkListp,q;
q=L;
charch;
cout<<"请输入链表元素,并且以输入#表示结束!"<<endl;
while(cin>>ch&&ch!='#')
{
p=newLnode[sizeof(Lnode)];
if(!p)
{
cout<<"获取内存失败"<<endl;
exit(ERROR);
}
p->data=ch;//尾插法
L->next=p;
L=p;
}
L->next=q;
}
voidoutput_List(LinkListL)//遍历单链表(输出单链表元素)
{
LinkListp;
p=L->next;
if(p==L)
{
cout<<"该链表是空链表!"<<endl;
exit(ERROR);
}
while(p!=L)
{
cout<<p->data<<"";
p=p->next;
}
}
Statusmain()
{
LinkListH;
H=(LinkList)malloc(sizeof(Lnode));
H->next=NULL;//设置头结点为空
Creat_List(H);
output_List(H);
return0;
}//头结点有和没有都是可以的,头结点只是为了让操作链表更方便,
⑧ C语言 单向链表如何排序
void link_order(STU *p_head)
{
STU *pb, *pf, temp;
pf = p_head;
if(p_head == NULL) {//链表为空
printf("needn't order. ");
return ;
}
if(p_head->next == NULL) {//链表有1个节点
printf("only one print, needn't order. ");
return ;
}
while(pf->next != NULL) {//以pf指向的节点为基准节点
pb = pf->next;//pb从基准点的下一个节点开始
while(pb != NULL) {
if(pf->num > pb->num) {
temp = *pf;
*pf = *pb;
*pb = temp;
temp.next = pf->next;
pf->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;
}
pf = pf->next;
}
return ;
}
(8)链表c语言单向扩展阅读:
链表的排序有三种情况:
1、链表为空时:不用排序;
2、链表中有一个节点:不用排序;
3、链表中两个及其以上节点时:排序。
return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。
⑨ c语言单向链表
name 保存在结构体单元的name[20] 数组里;
typedef struct node
{
char name[20];
struct node *link;
}stud;
这是你前面定义的结构体变量,一个单元包含两个部分,一个用来存储name的数组name[20],一个用来存放下一个单元地址的指向结构体node的指针。
假设该单元的地址是p,那么p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一个单元的地址。
--------------》你看不懂的部分如下《-----------------
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
在这段代码前面是分配一个结构体单元空间,s是这个新分配空间的地址,p是链表的尾节点的地址,以链表形式说,新分配的应当跟在它后面。
按上面所讲,p->link用来存放下一单元的地址,因此有:
p->link=s; 这样新节点就成为链表的一部分了。
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
这两句,是对将需要输入的名字读入并且存放在新节点用于存放name 的数组中。
此时,刚开辟的新节点成了尾节点,尾节点不指向任何其它节点,因此s->link=NULL;(NULL是空指针)
(C中处理指针需要小心行事)
p=s; 将p变量赋值为s,即让其为尾节点的地址,便于继续添加节点。