主题:[讨论]求单链表就地逆置的程序
不太会编程
[专家分:0] 发布于 2007-01-01 13:36:00
请教各位大虾
单链表就地逆置的程序怎么写 ?[em16][em16]
回复列表 (共9个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2007-01-01 14:25:00
可以把当前单链表所有内容从头依次取出并删除,取出的元素插总在临时链表的头部
直至原链表无有效元素为止
最后把临时链表赋给原链表
板凳
魔城侠客 [专家分:0] 发布于 2007-01-03 16:12:00
准确的来说,不应该再设头指针了,应该再设两个指针,再利用头指针进行置逆
程序如下
#include<stdio.h>
typedef struct QLink
{
int data;
struct QLink *next;
}QLink;
main()
{
QLink *head,*p,*q;
int length,i;
printf("此程序是实现链表置逆的功能.\n");
printf("请输入链表的长度:");
scanf("%d",&length);
while(length<=0)
{
printf("输入错误,长度必须为自然数,请重新输入.\n");
printf("请输入链表的长度:");
scanf("%d",&length);
}
printf("现在要输入各结点的值.\n");
for(i=1;i<=length;i++)
{
p=(QLink *)malloc(sizeof(QLink));
scanf("%d",&p->data);
p->next=NULL;
if(i==1) head=p;
else
{
q=head;
while(q->next!=NULL) q=q->next;
q->next=p;
}
}
printf("链表已建立,现在要将它输出.\n");
p=head;
for(i=1;i<=length;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
printf("现在要将其置逆.\n");
printf("程序置逆中……\n");
printf("置逆成功.现在要将新的链表输出.\n");
p=head;
while(head->next!=NULL)
{
q=p;
p=head->next;
head->next=p->next;
p->next=q;
}
head=p;
p=head;
for(i=1;i<=length;i++)
{
printf("%d ",p->data);
p=p->next;
}
system("pause");
}
3 楼
雪光风剑 [专家分:27190] 发布于 2007-01-03 18:56:00
[quote]准确的来说,不应该再设头指针了,应该再设两个指针,再利用头指针进行置逆
程序如下
#include<stdio.h>
typedef struct QLink
{
int data;
struct QLink *next;
}QLink;
main()
{
QLink *head,*p,*q;
int length,i;
printf("此程序是实现链表置逆的功能.\n");
printf("请输入链表的长度:");
scanf("%d",&length);
while(length<=0)
{
printf("输入错误,长度必须为自然数,请重新输入.\n");
printf("请输入链表的长度:");
scanf("%d",&length);
}
printf("现在要输入各结点的值.\n");
for(i=1;i<=length;i++)
{
p=(QLink *)malloc(sizeof(QLink));
scanf("%d",&p->data);
p->next=NULL;
if(i==1) head=p;
else
{
q=head;
while(q->next!=NULL) q=q->next;
q->next=p;
}
}
printf("链表已建立,现在要将它输出.\n");
p=head;
for(i=1;i<=length;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
printf("现在要将其置逆.\n");
printf("程序置逆中……\n");
printf("置逆成功.现在要将新的链表输出.\n");
p=head;
while(head->next!=NULL)
{
q=p;
p=head->next;
head->next=p->next;
p->next=q;
}
head=p;
p=head;
for(i=1;i<=length;i++)
{
printf("%d ",p->data);
p=p->next;
}
system("pause");
}[/quote]
你的程序逆置后的队列多了一个头结点
如果是带头节点的队列要注意修改这里
这程序算法比我的简明
但是这程序的写法有一些不严密
4 楼
wk0721 [专家分:0] 发布于 2007-01-06 20:16:00
void LinList<T>::change()
{
ListNode<T>*p,*q;
p=head->next;
head->next=NULL;
while(p!=NULL)
{
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
5 楼
Jonde [专家分:40] 发布于 2007-03-04 11:21:00
编译出错要加头文件
#include<malloc.h>
#include<windows.h>
6 楼
bpttc [专家分:8790] 发布于 2007-03-04 12:48:00
typedef struct QLink
{
int data;
struct QLink *next;
}* QLink;
我在用ANSI C来描述数据结构都定义成指针形式,这样调用函数的时候就全部是址传递了。
老严书上全部用的引用传递,那是C++的东西
7 楼
咖喱炒饭 [专家分:210] 发布于 2007-03-23 20:30:00
struct Node* reverse(struct Node *head)
{//倒转链表
struct Node *p1,*p2,*q;
p2=head;
p1=NULL;
while(p2!=NULL)
{
q=p2->next;
p2->next=p1;
p1=p2;
p2=q;
}
head=p1;
return head;
}
8 楼
gaolubing [专家分:20] 发布于 2007-03-30 16:46:00
void ReverseList(List L){
ListItem tmp;
int i;
for (i=0;i<L->n/2;i++) {
tmp=L->table[i];
L->table[i]=L->table[L->n-1-i];
L->table[L->n-1-i]=tmp;
}
}
9 楼
Fandywang [专家分:0] 发布于 2007-04-27 11:39:00
这里我做了简单总结,希望可以帮助你。
http://hi.baidu.com/fandywang%5Fjlu/blog/item/a56594c367f85254b219a87a.html
我来回复