
正文
c语言引用链表的函数 c语言引用链表的函数怎么写
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言链表的使用方法
下面的程序是单链表的建立与输出,都有详细的注释,相信你能看的懂
但要想学习链表必须得掌握了一定的C语言基础
下面这个链表的作用是建立5个结点的单链表,5个结点的值输入以后,依次输出各个结点的值
#includestdio.h
#includestdlib.h
//链表的建立与输出
struct node//定义结点的类型
{
int num,score;
node*link;
};
void main()
{
node*creat(int n);//函数原型声明
void print(node*h);//函数原型声明
node*head=0;//定义链头指针并初始化
head=creat(5);//调用creat函数创建链表
print(head);//调用print函数输出链表
}
node*creat(int n)
{
node*h=0,*p,*q;
int i;
for(i=1;i=n;i++)
{
q=(node*)malloc(sizeof(node));//分配一个结点空间
scanf("%d%d",q-num,q-score);//输入新结点的值
q-link=0;//新结点的指针域置0
if(h==0)
h=q;//第一个结点作为链头结点
else
p-link=q;//新结点添加到链表的末尾
p=q;
}
return h;//返回链头指针
}
void print(node*h)//链表输出函数的定义
{
while(h)//当指针h非空时输出h所指结点的值
{
printf("num=%d\tscore=%d\n",h-num,h-score);
h=h-link;//使h指向下一个结点
}
}
相关问答
Q1: C语言里面关于链表的一个函数
单链表的插入呀
for的意思是先创建一个空节点c语言引用链表的函数,p指向它c语言引用链表的函数,然后你输入一个元素,把这个元素放到这个节点的info域,即scanf(“%c”,p-info),这句应该在printf后面,你掉了
然后把这个p赋值给q的next域,应该是q-next=p;你写错了,即头节点指向下一个节点了
之后q=p;是让q指向这个新节点,继续循环。
正确代码:
for(i=1;in;i++)
{
p=(NODE*)malloc(sizeof(NODE));
printf("Enter a element\n");
scanf(“%c”,p-info);
q-next=p;
q=p;
}
Q2: 关于引用链表
我相信,通过我的说明,你会对这个问题完全理解的。
先说第一个问题,到底能不能引用链表?
首先,明确链表是什么东西。在C语言中,一般都是通过指向头节点的指针来表示链表,这个头指针是链表的入口和起点,也代表了整个链表。那么,它本质上是什么,说到底无非是指针变量。在C++中,也可以定义一个类比如叫做SingleList表示单链表类,具体的链表实例是该类的具体对象,此时,链表的本质是什么?是类的对象。
其次,引用是什么东西?引用是C++中引入的东西,C语言中没有,引用是变量的别名,操作引用和操作变量本身是一样的,引用不会分配新的内存空间。
因此,能不能引用链表的问题,就是有没有指针变量的引用、有没有对象的引用这样的问题。显然,指针变量的引用是可以的,有时候甚至是必须的;对象的引用也是如此。所以,答案很显然,可以引用链表!
再来说说第二个问题,要怎么引用链表?
我前面说了,对链表的引用,本质上是对指针变量或对象的引用,不仅是可以的,有时候甚至是必须的。下面我就举个例子。
在C语言中实现链表的时候,一般都会有个 init() 函数,其功能就是对链表进行初始化,简单的动作就是将链表的头指针置位NULL,就构造了一个空链表。所以,该函数的入口参数肯定得有一个链表的头,在函数里面才能将其设置为NULL。假设,我们这样来写,
void init(Node *head)
{
head = NULL;
}
在main函数里面调用的时候,
int main(void)
{
Node *head;
init(head) ; /* 初始化一个空的链表 */
return 0;
}
上面带注释的那句代码执行之后,head 就真的变成NULL了吗?不是吧?你想,Node *head;这一句,head现在是随机值,传给init函数之后,虽然在init()函数内部更改成了NULL,但它修改的是init中的局部变量,仅仅是形参变量而已,其实在函数执行完毕之后,main函数中的head没有任何变化。这就无法实现初始化空链表的功能了。
可行的方案,就是用引用。定义成下面这样
void init( Node * head) 或者用指向指针的指针 void init(Node **phead)
使用引用的时候,main中用init(head)就行了,使用二维指针时,main中要写成init(head);
通过上面的分析,相信你应该很清楚了,如果还有不明白的,欢迎交流。
Q3: 关于c语言链表函数
#includestdio.h#includewindows.h#include stdio.h#include malloc.h#include stdlib.h//定义数据类型名称typedef int DataType;#define flag -1 //定义数据输入结束的标志数据//单链表结点存储结构定义typedef struct Node{ DataType data; struct Node *next;}LNode ,*LinkList;//建立单链表子函数 LNode *Create_LinkList(){ LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针 while(1) { scanf("%d",x); if(-1==x) { return head; break;} s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =NULL; i++; if(i==1) head=s; else L-next =s; L=s; }}//查找子函数(按序号查找)LNode *Get_LinkList(LinkList L,int i){ LNode *p; int j; //j是计数器,用来判断当前的结点是否是第i个结点 p=L; j=1; while(p!=NULLji) { p=p-next ; //当前结点p不是第i个且p非空,则p移向下一个结点 j++; } return p;}//插入运算子函数void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点{ LNode *p,*s; p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("插入位置不合法!"); exit(-1); } else { s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =p-next ; p-next =s; }}//单链表的删除运算子函数void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点{ LNode *p,*q; p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作 exit(-1); } else { if(p-next ==NULL) { printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作 exit(-1); } else { q=p-next ; p-next =p-next-next; free(q); } }}//求表长运算子函数int Length_LinkList(LinkList L){ int l; //l记录L的表长 LNode *p; p=L; l=1; while(p-next) { p=p-next; l++; } return l;}int main (){ LNode *head,*p; head=(LinkList)malloc(sizeof(LNode)); int x,y; a: printf("*******menu*******\n"); printf("**创建**********1*\n"); printf("**插入**********2*\n"); printf("**删除**********3*\n"); printf("**表长**********4*\n"); printf("**清屏**********5*\n"); printf("**打印**********6*\n"); printf("**退出******other*\n"); printf("******************\n"); int i=1; while(i) { printf("请输入选项:"); scanf("%d",i); switch(i) { case 1:head=Create_LinkList(); getchar();break; case 2:printf("请输入位置和数据;"); scanf("%d%d",x,y); Insert_LinkList(head,x,y);break; case 3:printf("请输入位置;"); scanf("%d",x); Delete_LinkList(head,x);break; case 4:printf("%d",Length_LinkList(head));break; case 5:system("cls");goto a; case 6:p=head; while(p!=NULL) {printf("%d\n",p-data); p=p-next;} break; default :i=0; } }}
我把创建给改了一下
c语言引用链表的函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言引用链表的函数怎么写、c语言引用链表的函数的信息别忘了在本站进行查找喔。







