用迭代可,用递归可
前者还简单些,从头开始取出结点,把这个结点当新链表的尾结点连接。
后者思想就是把头结点拿出来,把剩下的倒转,再在尾部添加头结点。
头插法实现单链表的逆置
改了下楼上的程序:
void reserve(LinkList L)
{
LinkNode *p,*q;
p=L->next;
L->next=NULL;
while(p)
{
q=p->next;//保存后续节点的指针
p->next=L->next;//头插法
L->next=p;
p=q;//节点后移
}
}
//带头结点的链表建立
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct node{
int data;
struct node* next;
}LinkList;//数据结点
typedef struct{
int length;
struct node*next;
}Tnode; //头结点
Tnode *CreatList()
{//头插法建立单链表
Tnode *head;
LinkList *p;
int fg;
head=(Tnode *)malloc(sizeof(Tnode));
head->next=NULL;
printf("请输入链表中的数据(至少输入2个以上数据且以888结束):\n");
scanf("%d",&fg);
while(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=head->next;
head->next=p;
scanf("%d",&fg);
}
if(fg==888)
printf("\n输入结束!\n\n");
return head;
}
Tnode *Creat_List()
{//尾插法建立单链表
Tnode *head;
LinkList *p,*pre;
int fg;
head=(Tnode *)malloc(sizeof(Tnode));
head->next=NULL;
printf("请输入链表中的数据(至少输入2个以上数据且以888结束):\n");
scanf("%d",&fg);
if(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=NULL;
head->next=p;
pre=p;
}
scanf("%d",&fg);
while(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=pre->next;
pre->next=p;
pre=p;
scanf("%d",&fg);
}
if(fg==888)
printf("\n输入结束!\n\n");
return head;
}
void ReadList(Tnode *head)
{//读取链表中的数据
LinkList *p;
p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void ExchangeList(Tnode *head)
{//链表的倒置
LinkList *r,*s;
r=head->next;
head->next=NULL;
while(r)
{
s=r->next;
r->next=head->next;
head->next=r;
r=s;
}
}
void Readme()
{
printf("-------------------------------");
printf("链表的建立和逆置");
printf("--------------------------------\n");
printf("请选择操作:\n");
printf(" 1.头插法建立链表;\n");
printf(" 2.尾插法建立链表;\n");
printf(" 0.退出;\n");
printf("-------------------------------------------------------------------------------\n");
}
void main()
{
Tnode *head;
int choice;
while(choice)
{
Readme();
scanf("%d",&choice);
switch(choice)
{
case 1:
head=CreatList();
printf("链表中数据为:\n\n");
ReadList(head);
printf("\n");
ExchangeList(head);
printf("逆置后的链表中的数据为:\n\n");
ReadList(head);
getch();
break;
case 2:
head=Creat_List();
printf("链表中数据为:\n\n");
ReadList(head);
printf("\n");
ExchangeList(head);
printf("逆置后的链表中的数据为:\n\n");
ReadList(head);
getch();
break;
}
}
}
用VC++6.0做的
[此贴子已经被作者于2007-9-30 13:21:33编辑过]