链表反序

JavaScript02

链表反序,第1张

/*

*链表应用要求:1建立 2删除 3输出 4反序 5主函数

*/

#include<iostream>

#include<iomanip>

using namespace std

typedef struct Lnode{

int data

struct Lnode *next

}Lnode,*LinkList

//初始化链表

bool initList(LinkList &L)

{

L=new Lnode

if(L==NULL){

cerr<<"内存分配错误!"<<endl

return false

}

L->next=NULL

return true

}

//创建链表

bool createList(LinkList &L)

{

int n,data

LinkList p=L,r

cout<<"输入链表元素的个数:"

cin>>n

cout<<"输入链表中的元素:"

for(int i=0i<n++i){

cin>>data

r=new Lnode

if(r==NULL){

cerr<<"内存分配错误!"<<endl

return false

}

r->data=data

r->next=p->next

p->next=r

p=r

}

p->next=NULL

return true

}

//删除链表中的元素

bool deleteList(LinkList L)

{

int pos

LinkList p=L

if(p->next==NULL){

cout<<"链表是空的!"<<endl

return false

}

cout<<"输入你要删除的位置:"

cin>>pos

for(int i=0i<pos-1++i){

p=p->next

}

LinkList q=p->next

cout<<"你删除的第"<<pos<<"个位置的元素是:"<<q->data<<endl

p->next=q->next

delete q

return true

}

//逆序输出链表中的元素

bool invertList(LinkList &L)

{

LinkList p=L->next

if(p==NULL) return false

else invertList(p)//采用递归的方式逆序输出链表

cout<<p->data<<setw(5)

return true

}

//输出链表中的元素

bool dispList(LinkList L)

{

LinkList p=L->next

if(p==NULL){

cout<<"链表是空的!"<<endl

return false

}

cout<<"链表中的元素为:"

while(p){

cout<<p->data<<setw(5)

p=p->next

}

cout<<endl

return true

}

void main()

{

LinkList L

initList(L)

createList(L)

dispList(L)

deleteList(L)

dispList(L)

cout<<"逆序输出的元素为:"

invertList(L)

cout<<endl

}

题目中的将链表逆序,如果用单链表实现有点麻烦,我再想想有没有好的办法。

上面的程序中我只是将链表的元素逆序输出,至于将链表逆序,我想好了会回复你的。

将一条链表按逆序输出

假若头结点为L,则有

p=q=L/*p,q为指向头结点的两个指针*/

while(p->next!=NULL)

p=p->next/*让p指向键表的最后一个要访问结点*/

while(1)

{

while(q->next!=p)

q=q->next/*让q向后找,找到最后一个要打印的结点*/

printf("%d\n",p->data)

p=q/*p向前移动一个*/

q=L/*q又指向头结点*/

if(p=L)/*访问完了退出*/

break

}

你参考吧