c语言的链表输入函数 c语言函数调用链表
请问这个链表主函数怎么写?(用C语言,可以从键盘输入n个数实现)
哥们你这是数据结构上的吧。。。。。。学数据结构要灵活。。。。。
成都创新互联专业为企业提供袁州网站建设、袁州做网站、袁州网站设计、袁州网站制作等企业网站建设、网页设计与制作、袁州企业网站模板建站服务,10年袁州做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
这里给你一个建立链表的程序:(以SDUTOJ 2116题为例题)
#include iostream
using namespace std;
class List
{
public:
int data;//数据域,用来记录数据
List *next;//指着域,用来记录它下一个节点的地址
//访问这个变量能找到它的下一个节点
};
void del(List *p)//递归释放内存
{
if(p == NULL)//p为NULL说明p访问到链表结尾了
return ;//访问到结尾返回
del(p-next);//如果没访问到结尾,会在这里一直调用函数本身递归,直到遇见NULL
delete p;//遇到NULL返回到head的时候,从后向前删除节点,释放内存
//如果从前面删除的话就会把本节点的next值也给删除了,就没办法访问到下一个节点了
//如果定义一个临时变量先记录下一个节点地址然后再删除本节点也是可以解决这个问题的
}
//void del(List *head)
//{
// List *p = head,*q;
// while(p)
// {
// q = p;
// p = p-next;
// delete q;
// }
//}//这样释放内存也是可以的
int main()
{
List *head = new List;//new开辟内存,地址赋给head,head代表这个
//链表的头,访问head能找到这个链表
head-next = NULL;//初始状态下只有head链节,他没有后继结点,所以他的next值为NULL(空)
List *p,*q;//p是游动指针,建立链表的时候永远指向最后一个链节
//q是开新内存用的,也就是增加一个新的链节
int n;//输入数的个数
cinn;
p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向head
for(int i = 0;i n;i++)
{
q = new List;//增加新的链节q
cinq-data;//给新链节的data赋值
p-next = q;//把q挂在p(初始值是head)的后面
q-next = NULL;//新链节是链表的最后一个链节,后面没有后继,那么,就把他的next值设为NULL(空)
p = q;//q成为p的后继之后,q就是最后一个节点,我们规定p指向最后一个节点,这里就把q赋给p
}//循环完成后,链表就建立完了,head是他们的头
p = head-next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的
//现在我们就发动他的游动特点,来访问整个链表,从上面看来,我们输入的第一个整数放在q-data
//里面了,并没有放在head里面,那么,我们访问的话,head的下一个节点才是第一个存储节点,用p
//访问head的next,判就指向了链表中的第一个存储输入数的节点(真正第一个节点是head,因为head
//因为head的data没有值,所以,我们说head的后面第一个节点为有效节点)
while(p != NULL)//当p访问不到NULL的时候,就会一直循环,NULL是链表结束的标志
{
coutp-data;//输出p访问到的每个节点的data值
if(p-next != NULL)
cout" ";//这两行是调格式的,为了能在最后不多输出空格,其实只是为了在OJ上AC
p = p-next;//p访问把本节点的next值,p就指向下一个节点,相当于向后移动一个节点
}
coutendl;
del(head);//释放内存
return 0;
}
C语言里面关于链表的一个函数
单链表的插入呀
for的意思是先创建一个空节点,p指向它,然后你输入一个元素,把这个元素放到这个节点的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;
}
C语言链表创建和输入
敢问楼主,为何要两个链表?你的需求一个链表完全搞定了啊,第二个链表是用来做什么的?
#includestdio.h
#includestdlib.h
struct student{
char name[10];
char id[10];
struct student *next;
};
int main(void)
{
int n;
printf("请输入要学生个数,以回车结束!\n");
scanf("%d",n);
struct student *head=(struct student *)malloc(sizeof(struct student));
head-next=NULL;
struct student *end=head;
for(int i=0;i!=n;i++)
{
struct student*p=(struct student *)malloc(sizeof(struct student));
p-next=NULL;
printf("第%d个学生信息:\n",i+1);
printf(" 姓名:");
scanf("%s",p-name);
printf(" 学号:");
scanf("%s",p-id);
end-next=p;
end=p;
}
for(struct student *p=head-next;p!=NULL;p=p-next)
{
printf("姓名:%s 学号:%s \n",p-name,p-id);
}
}
截图如下:
c语言 双向链表的初始化和输入
两个函数都有问题
初始化函数的问题在于,c语言函数参数的传递是传值的,你的函数中这样去操作参数是无效的。可如下改
void InitDList(DList *L)
{
*L=......;
*L-next=*L;
*L-prior=*L;
}
则以后调用时,可如下
DList dlist;
InitDList(dlist);
第二个函数主要是插入有问题,将p2插入到p1的后面,可以这样做
p2-next=p1-next;
p1-next=p2;
p2-prior=p1;
p2-next-prior=p2;
c语言链表插入一个新节点的函数问题
首先,主函数中,“请输入插入的数据”那里scanf应该是b,这是引发崩溃的原因。
其次,insert函数的目的应该是想插入数据后仍是有序链表。但你的insert函数逻辑太乱,有些不必要的判断,我修正了你的代码,贴给你看看。(虽然你insert是想保证有序,但你在创建的时候没有保证有序,所以最终结果不一定是有序。例如,创建 1,5,2,插入3,最后输出的是 1,3,5,2)
代码修改:
scanf("%d", b);
重写了insert函数,简化逻辑;
动态分配的内存记得释放,增加freeNode释放空间
#include stdio.h
#include stdlib.h
struct link
{
int data;
struct link *next;
};
struct link *add(struct link *head);//创建链表
void display(struct link *head);//输出数据
struct link *insert(struct link *head, int b); //插入新节点
void freeNode(struct link *); //释放空间
int main()
{
char c;
struct link *head = NULL;
printf("要创建一个链表吗?");
scanf(" %c", c);
while (c == 'y' || c == 'Y')
{
head = add(head);
printf("要继续创建节点吗?");
scanf(" %c", c);
}
display(head);
int b;
printf("输入插入的数据");
scanf("%d", b);
head = insert(head, b);
display(head);
freeNode(head);
}
struct link *add(struct link *head)
{
int data;
struct link *p = (struct link*)malloc(sizeof(struct link));
if (head == NULL)
{
head = p;
}
else
{
struct link *pr = head;//一个临时指针pr先保存下head的地址
while (pr-next != NULL)
{
pr = pr-next;
}
pr-next = p;
}
printf("输入数据");
scanf("%d", p-data);
p-next = NULL;
return head;
}
void display(struct link *head)
{
struct link *pr = head;
while (pr != NULL)
{
printf("%d\n", pr-data);
pr = pr-next;
}
}
struct link *insert(struct link *head, int b)
{
struct link *ptr = head, *prev = head;
struct link *newNode = (struct link *)malloc(sizeof(struct link));
newNode-data = b;
while (ptr b ptr-data) {
prev = ptr;
ptr = ptr-next;
}
newNode-next = ptr;
if (ptr == head) head = newNode;
else prev-next = newNode;
return head;
}
void freeNode(struct link *node) {
if (!node) return;
freeNode(node-next);
free(node);
}
C语言链表的输入
#include "stdio.h"
#include "malloc.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
struct student *creat(void)
{
struct student *p1,*p2,*head;
n=0;
p1=(struct student*) malloc(LEN);
p2=p1;
scanf("%ld,%f",p1-num,p1-score);
head=NULL;
while(p1-num!=0)
{
n=n+1;
if(n==1)
head=p2;
else
p2=p1;//这里是把p1的地址赋值给p2
p1=(struct student*) malloc(LEN);
p2-next = p1;
scanf("%ld,%f",p1-num,p1-score);
}
p2-next=NULL;
return(head);
}
int main(void)
{
struct student *head_link;
printf("please input records, as 2007,100:\n");
head_link=creat();
while(head_link != NULL)
{
printf("%ld,%f\n",head_link-num,head_link-score);
head_link = head_link-next;
}
return 0;
}
这个应该就可以用了,你的里面除了一些像print等语法错误之外
最主要的是错误是在creat函数对链表中元素(现在采用了指针,对p1与p2)的处理不当
首先你使用head保存链表中第一个元素也就是第一个节点的首地址
然后依靠p1和p2继续分配地址,p1分配地址并获取数据,通过while中的条件,如果不是终止标识就存储进链表中(通过p2-next,所以严格意义上来讲,p1就是单纯的指针,我们并没有把它链进链表中去,只有p2是用来链进链表中的),所以你的主要失误是p1=p2-next处理的不对
呵呵,我自己也不怎么会,要是说的不对的地方,还请谅解
分享名称:c语言的链表输入函数 c语言函数调用链表
网站URL:http://hbruida.cn/article/dodhdid.html