跪求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函数那一块改成尾插法插入,但改了几次,运行时程序总停止,得不到正确结果,希望有好心人帮我改动一下,保证正常运行,万分感激!
展开
 我来答
cpucash
2013-08-15 · TA获得超过1584个赞
知道小有建树答主
回答量:1457
采纳率:66%
帮助的人:973万
展开全部
last = last -> prev;你这是尾插法吗?
感觉应该是头插法吧
你把new的节点放到last的最前面了吧
尾插法,应该有个循环,判断一下是否到尾部吧
加入代码
while(last->prev!=NULL)
last=last->prev;
这样last就是指向最后一个节点的指针了

再让new肤质给last-prev

还有一个问题,new是不是c的保留字啊,你就让他当变量来用
更多追问追答
追问
原来的程序是头插法,现再就是想请教改称尾插法的方法
我把new已经改成newp了,还有除了add函数那一块,主函数main也要改动吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1132159366
2013-08-15 · TA获得超过186个赞
知道小有建树答主
回答量:218
采纳率:100%
帮助的人:157万
展开全部
最简单的方法就是把你main里面的for循环改成for(i=MAX;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;
}
这样基本上就正常了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式