跪求c语言高手 一道关于单链表尾插法的问题
以下是一个头插法的单链表程序#include<stdio.h>#include<stdlib.h>#defineMAX5typedefstructdataData;typ...
以下是一个头插法的单链表程序
#include <stdio.h>
#include <stdlib.h>
#define MAX
5
typedef struct data Data;
typedef struct data *DataP;
struct
data{
int val;
DataP prev;
};
DataP add_data(int i,DataP
last);
void print_data(DataP last);
void free_list(DataP last);
int
main()
{
int i;
DataP last =
NULL;
for(i=0;i<MAX;++i){
last =
add_data(i,last);
}
print_data(last);
free_list(last);
exit(0);
}
DataP
add_data(int i,DataP last)
{
DataP new;
if((new =
(DataP)malloc(sizeof(Data))) == NULL){
fprintf(stderr,"data allocation error
!\n");
exit(1);
}
new -> val = i;
new -> prev =
last;
return new;
}
void print_data(DataP last)
{
while(last
!= NULL){
printf("output data %d\n",last -> val);
last = last ->
prev;
}
}
void free_list(DataP last)
{
DataP
olast;
while(last != NULL){
olast = last;
last = last ->
prev;
free(olast);
}
}
这个程序的运行结果如下
output data 4
output data 3
output data 2
output data 1
output data 0
问题:如何改动以上程序,让运行的结果从小到大输出,我也知道是将add函数那一块改成尾插法插入,但改了几次,运行时程序总停止,得不到正确结果,希望有好心人帮我改动一下,保证正常运行,万分感激! 展开
#include <stdio.h>
#include <stdlib.h>
#define MAX
5
typedef struct data Data;
typedef struct data *DataP;
struct
data{
int val;
DataP prev;
};
DataP add_data(int i,DataP
last);
void print_data(DataP last);
void free_list(DataP last);
int
main()
{
int i;
DataP last =
NULL;
for(i=0;i<MAX;++i){
last =
add_data(i,last);
}
print_data(last);
free_list(last);
exit(0);
}
DataP
add_data(int i,DataP last)
{
DataP new;
if((new =
(DataP)malloc(sizeof(Data))) == NULL){
fprintf(stderr,"data allocation error
!\n");
exit(1);
}
new -> val = i;
new -> prev =
last;
return new;
}
void print_data(DataP last)
{
while(last
!= NULL){
printf("output data %d\n",last -> val);
last = last ->
prev;
}
}
void free_list(DataP last)
{
DataP
olast;
while(last != NULL){
olast = last;
last = last ->
prev;
free(olast);
}
}
这个程序的运行结果如下
output data 4
output data 3
output data 2
output data 1
output data 0
问题:如何改动以上程序,让运行的结果从小到大输出,我也知道是将add函数那一块改成尾插法插入,但改了几次,运行时程序总停止,得不到正确结果,希望有好心人帮我改动一下,保证正常运行,万分感激! 展开
2个回答
展开全部
last = last -> prev;你这是尾插法吗?
感觉应该是头插法吧
你把new的节点放到last的最前面了吧
尾插法,应该有个循环,判断一下是否到尾部吧
加入代码
while(last->prev!=NULL)
last=last->prev;
这样last就是指向最后一个节点的指针了
再让new肤质给last-prev
还有一个问题,new是不是c的保留字啊,你就让他当变量来用
感觉应该是头插法吧
你把new的节点放到last的最前面了吧
尾插法,应该有个循环,判断一下是否到尾部吧
加入代码
while(last->prev!=NULL)
last=last->prev;
这样last就是指向最后一个节点的指针了
再让new肤质给last-prev
还有一个问题,new是不是c的保留字啊,你就让他当变量来用
更多追问追答
追问
原来的程序是头插法,现再就是想请教改称尾插法的方法
我把new已经改成newp了,还有除了add函数那一块,主函数main也要改动吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最简单的方法就是把你main里面的for循环改成for(i=MAX;i>0;i--)。
如果想从0开始输出的话就改成for(i=MAX-1;i>=0;i--)
如果想从0开始输出的话就改成for(i=MAX-1;i>=0;i--)
更多追问追答
追问
这样改的确可以,但还是想请教下改成尾插法的方法
追答
要是想改成尾插法的话,可以这样改
DataP add_data(int i,DataP last)
{
DataP Pnew;
if((Pnew = (DataP)malloc(sizeof(Data))) == NULL)
{
fprintf(stderr,"data allocation error !\n");
exit(1);
}
Pnew -> val = i;
if(last!=NULL)/////////添加这两句
last->prev=Pnew;////////////添加这两句
Pnew -> prev = NULL;////////////修改这一句
return Pnew;
}
但是改完之后,他只会输出一个4,原因是在你主函数里面,last指针一直是变动的,当完成for循环之后,他就在4这个位置,所以输出值能输出一个4。这就是你头节点的问题了。
你可以在主函数里面这样改:
int main()
{
int i;
DataP last = NULL;
DataP head;//定义一个头结点;
for(i=0;i<MAX;i++)
{
last = add_data(i,last);
if(!i)//这个地方就是当for循环第一次的时候,把获得的这第一个链表节点赋给头节点
head=last;//这个地方就是当for循环第一次的时候,把获得的这第一个链表节点赋给头节点
}
print_data(head);/*然后接下来就是输出传入头结点,然后就会从第一个节点开始往后遍历,就可以全部输出出来了*/
free_list(head);//释放节点也是一样的,从第一个头结点开始释放
return 0;
}
这样基本上就正常了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询