单链表就地逆置的问题!!!!!!!!!

huangxiaohua 2004-10-15 07:28:27
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#define LIST_INIT_LENGTH 10
#define OK 1
typedef int ElemType;
typedef struct CirLNode
{
ElemType data;
struct CirLNode *next;
} CirLNode, *CirLinkList;
void CreateList_L(CirLinkList &L,int n) //构造 单链表 L
{
int i;
CirLNode *p;
int array[LIST_INIT_LENGTH];
L=(CirLinkList)malloc(sizeof(CirLNode));
L->next=NULL;

printf("请输入结点的data域,必须为整数,以回车或者空格作为间隔: <如: 34 20 2 3 10 51 12>\n");
for(i=0;i<n;i++) //输入结点的data元素
scanf("%d",&array[i]);
for(i=n-1;i>=0;--i)
{ p=(CirLinkList)malloc(sizeof(CirLNode)); //新建结点
p->data=array[i]; //data 域
p->next=L->next; //next 域
L->next=p;
} //end of for
//for(p=L;p->next!=NULL;p=p->next) ;
//p->next=L; //最后一个结点指向头结点
} //end of CreateList_L() function
int Contray_CirL(CirLinkList &L) // 将单链表逆置,并返回 OK
{CirLinkList t,p,q;
t=L;
t=t->next;
p=t->next;
t->next=NULL;
while (p!= NULL )
{q=p->next;//修改q结点 next 域指针,使之指向其前驱
p->next=t; // 顺链向后移动指针 t
t=p; // 顺链向后移动指针 p
p=q; // 顺链向后移动指针 q
} // while 结束
L= t;//
return OK;
} // Contray_CirL
void main() //main() 函数
{CirLinkList L; CirLNode *p;
int LNodeNum; // 存储单链表元素的个数
cout<<"请输入单循环链表元素的个数? <如 7> : ";
cin>>LNodeNum;
CreateList_L(L,LNodeNum); //构造单链表L
cout<<endl<<"新建的单链表L如下:"<<endl; p=L;
while(p->next!=NULL)
{p=p->next;
cout<<p->data<<" -> "; //输出单链表元素
}

Contray_CirL(L);

cout<<"逆置后的单链表L如下:"<<endl;
p=L;
while(p->next!=NULL)
{
p=p->next;
cout<<p->data<<" -> "; //输出逆置后的单循环链表
}

cout<<endl<<"...OK...!"<<endl;
getch();
}//end of main() function







请各位高手帮忙!!!!
编译都通过的!
我这个到底是那里出错了!


当我输入4 5 6 7 8 时
结果是7 6 5 4
?????
怎么会是这样的啊



...全文
801 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
realmz 2004-10-15
  • 打赏
  • 举报
回复
int Contray_CirL(CirLinkList &L)有问题
比如本来链表是
L->Nod1->Nod2->Nod3->Nod4->NULL
逆置后 NULL<-Nod1<-Nod2<-Nod3<-Nod4
所以你输出时少了一个Nod4
应该把int Contray_CirL(CirLinkList &L)改一下,再加一个链表头
int Contray_CirL(CirLinkList &L) // 将单链表逆置,并返回 OK
{CirLinkList t,p,q;
t=L;
t=t->next;
p=t->next;
t->next=NULL;
while (p!= NULL )
{q=p->next;
p->next=t;
t=p;
p=q;
}
L->next= t;// 在这里改一下
return OK;
}
zhaoshichu 2004-10-15
  • 打赏
  • 举报
回复
你在原地逆置时,已经把空的头节点删除了,有两种该法,
(1)
在int Contray_CirL(CirLinkList &L)函数的最后,return OK前加一条语句 L->next = t;
(2)
输出逆置后的链表时,将while(p->next!=NULL)
{
p=p->next;
cout<<p->data<<" -> "; //输出逆置后的单循环链表
}
改成:
while(p)
{
cout<<p->data<<" ->";
p = p->next;
}
liluvu 2004-10-15
  • 打赏
  • 举报
回复
把你的L= t;//
改成L->next = t;就可以了
qingyuan18 2004-10-15
  • 打赏
  • 举报
回复
把连表结构和节点结构分开定义,这样能够方便的进行连表倒置

typedef struct node{
struct node *next;
int value;
}node;


typedef struct list {
node *head;
int lenth;
}list;


这样连表倒置就简单了:

void converse(list *mylist)
{
node *temp_node = null; /*该节点指针用于遍历mylist*/
node *new_node = null; /*该节点指针用于新分配插入节点*/
list *temp = (list *)malloc(sizeof(list));

temp->lenth =0;
temp->head = null;
temp_node = mylist->head;
while(temp_node!=null)
{
new_node= (node *)malloc(sizeof(node)); /*给新分派的节点原样复制 */
new_node->next = null;
new_node->value = temp_node->value;

new_node->next = temp->head; /*从表首插入,即可实现倒置*/
new->head = temp_node;
temp_node = temp_node->next;
}
mylist->head = temp->head;

}
kobefly 2004-10-15
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#define LIST_INIT_LENGTH 10
#define OK 1
typedef int ElemType;
typedef struct CirLNode
{
ElemType data;
struct CirLNode *next;
} CirLNode, *CirLinkList;
void CreateList_L(CirLinkList &L,int n) //¹¹Ôì µ¥Á´±í L
{
int i;
CirLNode *p;
//CirLNode *temp;
int array[LIST_INIT_LENGTH];
L=(CirLinkList)malloc(sizeof(CirLNode));
L->next=NULL;
//temp = L;

printf("ÇëÊäÈë½áµãµÄdataÓò,±ØÐëΪÕûÊý,ÒԻسµ»òÕß¿Õ¸ñ×÷Ϊ¼ä¸ô: <Èç: 34 20 2 3 10 51 12>\n");
for(i=0;i<n;i++) //ÊäÈë½áµãµÄdataÔªËØ
scanf("%d",&array[i]);
for(i=n-1;i>=0;--i)
{ p=(CirLinkList)malloc(sizeof(CirLNode)); //н¨½áµã
p->data=array[i]; //data Óò
p->next=L->next; //next Óò
L->next=p;
} //
//for(p=L;p->next!=NULL;p=p->next) ;
//p->next=L; //×îºóÒ»¸ö½áµãÖ¸ÏòÍ·½áµã
} //end of CreateList_L() function
int Contray_CirL(CirLinkList &L) // ½«µ¥Á´±íÄæÖ㬲¢·µ»Ø OK
{
CirLinkList t,p,q;

t=L;
t=t->next;
p=t->next;
t->next=NULL;
while (p!= NULL )
{
q=p->next;//ÐÞ¸Äq½áµã next ÓòÖ¸Õ룬ʹָ֮ÏòÆäÇ°Çý
p->next=t; // ˳Á´ÏòºóÒƶ¯Ö¸Õë t
t=p; // ˳Á´ÏòºóÒƶ¯Ö¸Õë p
p=q; // ˳Á´ÏòºóÒƶ¯Ö¸Õë q
} // while ½áÊø
L= t;//

return OK;
} // Contray_CirL
void main() //main() º¯Êý
{
CirLinkList L;
CirLNode *p;
int LNodeNum;
// ´æ´¢µ¥Á´±íÔªËصĸöÊý
cout<<"ÇëÊäÈ뵥ѭ»·Á´±íÔªËصĸöÊý? <Èç 7> : ";
cin>>LNodeNum;
CreateList_L(L,LNodeNum); //¹¹Ôìµ¥Á´±íL
cout<<endl<<"н¨µÄµ¥Á´±íLÈçÏÂ:"<<endl;
p=L;
while(p->next!=NULL)
{
p=p->next;
cout<<p->data<<" -> "; //Êä³öµ¥Á´±íÔªËØ
}

Contray_CirL(L);

cout<<endl<<"ÄæÖúóµÄµ¥Á´±íLÈçÏÂ:"<<endl;
p=L;
while(p->next!=NULL)//这里有点问题,修改如下
{

cout<<p->data<<" -> ";
p=p->next;
if(p->next == NULL)
cout<<p->data;//Êä³öÄæÖúóµÄµ¥Ñ­»·Á´±í
}

cout<<endl<<"...OK...!"<<endl;
getch();
}//end of main() function

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧