找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1285|回复: 9

链表问题

[复制链接]
发表于 2009-11-3 02:52:43 | 显示全部楼层 |阅读模式 IP:江苏扬州
请问在一个单向链表里怎么样做,才能把这个链表的数据从后往前输出呢?
发表于 2009-11-3 02:52:44 | 显示全部楼层 IP:江苏扬州
void oppsite(part *dest)
{

if(dest->next==0)
cout<<dest->data<<' ';
else
{
oppsite(dest->next);
cout<<dest->data<<' ';
}
}
dest是指向链表第一个接点的指针
回复

使用道具 举报

发表于 2009-11-3 02:52:46 | 显示全部楼层 IP:江苏扬州
用递归做有一个问题,因为链表的第一个节点是头节点,他没有数据,所以打印出来的数据是系统给的.就是说我输入10个数,打印了11个数,有什么办法解决吗?
回复

使用道具 举报

发表于 2009-11-3 02:52:48 | 显示全部楼层 IP:江苏扬州
实参传递时应该将指向链表第一个存在有效数据接点的指针
传递给调用函数
回复

使用道具 举报

发表于 2009-11-3 02:52:49 | 显示全部楼层 IP:江苏扬州
比如part *dest是你的头结点,你只需要part *newPart=dest;
然后newPart=newPart->next;这时newPart指向的就是非头结点的第一个结点。可以做为参数传递了
回复

使用道具 举报

发表于 2009-11-3 02:52:51 | 显示全部楼层 IP:江苏扬州
写个双向链表不就行啦!
回复

使用道具 举报

发表于 2009-11-3 02:52:54 | 显示全部楼层 IP:江苏扬州
最好是用双向链表,对于单向的链表,无论你是否用递归,最后都是把所有的节点都重新在内存里存了一遍。十分浪费内存和时间。
回复

使用道具 举报

发表于 2009-11-3 02:52:57 | 显示全部楼层 IP:江苏扬州
支持版主!!
回复

使用道具 举报

发表于 2009-11-3 02:52:58 | 显示全部楼层 IP:江苏扬州
恩??
我不是回你一个双向链表帖了么
没看么
回复

使用道具 举报

发表于 2009-11-3 02:53:00 | 显示全部楼层 IP:江苏扬州
发个咱自己的!
注释写的不好,不好意思啊
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int item;
struct node *prior, *next;
}*dLinkList, dListNode;
void CreateList(dLinkList *headPtr, dLinkList *tailPtr);//创建链表
void InsertElem(dLinkList *headPtr, dLinkList *tailPtr, int index, int newitem);//插入结点
int DeleteElem(dLinkList *headPtr, dLinkList *tailPtr, int index);//删除结点
void VisitList(dLinkList headPtr, dLinkList tailPtr);//遍力链表
void DestroyList(dLinkList *headPtr, dLinkList *tailPtr);//销毁链表
int main(void)
{
int delitem;
dLinkList newhead = NULL, newtail = NULL;
CreateList(&newhead, &newtail);
VisitList(newhead, newtail);
InsertElem(&newhead, &newtail, 4, 29);
VisitList(newhead, newtail);
delitem = DeleteElem(&newhead, &newtail, 2);
VisitList(newhead, newtail);
printf("delete item = %d\n", delitem);
DestroyList(&newhead, &newtail);
return 0;
}
void CreateList(dLinkList *headPtr, dLinkList *tailPtr)
{
int newitem;
dLinkList newPtr;
printf("Enter one number:\n");
scanf("%d", &newitem);
while (newitem != 0)
{
newPtr = (dLinkList)malloc(sizeof(dListNode));
if (newPtr == NULL)
{
exit(1);
}
newPtr -> item = newitem;
newPtr -> next = NULL;
newPtr -> prior = NULL;
if (*headPtr == NULL)
{
newPtr -> next = *headPtr;
newPtr -> prior = *headPtr;
*headPtr = newPtr;
}
else
{
(*tailPtr) -> next = newPtr;
newPtr -> prior = *tailPtr;
}
newPtr -> next = NULL;
*tailPtr = newPtr;

printf("Enter one number:\n");
scanf("%d", &newitem);
}
}
void VisitList(dLinkList headPtr, dLinkList tailPtr)//逆序
{
while (tailPtr != NULL)
{
printf("%d ", tailPtr -> item);
tailPtr = tailPtr -> prior;
}
printf("\n");
}
void DestroyList(dLinkList *headPtr, dLinkList *tailPtr)
{
dLinkList temp;
while (*headPtr != NULL)
{
temp = *headPtr;
*headPtr = (*headPtr) -> next;
free(temp);
}
*headPtr = NULL;
*tailPtr = NULL;
}
void InsertElem(dLinkList *headPtr, dLinkList *tailPtr, int index, int newitem)
{
int pos = 0;
dLinkList newPtr, cur = NULL;
cur = *headPtr;
newPtr = (dLinkList)malloc(sizeof(dListNode));
if (newPtr == NULL)
{
exit(1);
}
newPtr -> item = newitem;
while (cur && pos < index)
{
cur = cur -> next;
pos ++;
}
newPtr -> next = cur;
newPtr -> prior = cur -> prior;
cur -> prior -> next = newPtr;
cur -> prior = newPtr;
}
int DeleteElem(dLinkList *headPtr, dLinkList *tailPtr, int index)
{
int pos = 0, delitem;
dLinkList cur;
cur = *headPtr;
while (cur && pos < index)
{
cur = cur -> next;
pos ++;
}
delitem = cur -> item;
cur -> prior -> next = cur -> next;
cur -> next -> prior = cur -> prior;

free(cur);

cur = NULL;
return delitem;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 11:36 , Processed in 0.266606 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表