首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教单向链表反序的解法,该如何解决

2012-02-06 
求教单向链表反序的解法如题[解决办法]pheadwhile(p- next!null){qp- nextq- nextppq}[解决办

求教单向链表反序的解法
如题

[解决办法]
p=head;

while(p-> next!=null)
{
q=p-> next;
q-> next=p;
p=q;
}
[解决办法]
单链表的逆转:

struct mr_node
{
int data;
mr_node *next;
};

int main()
{
mr_node *p1=NULL;
mr_node *p2=NULL;
mr_node *p3=NULL;

// create a cyclic list
p1=(mr_node *)(malloc(sizeof(mr_node)));
p1-> data=0;
p2=p1;
p3=p1;
for(int a=1;a <20;a++)
{
p3 = (mr_node *)(malloc(sizeof(mr_node)));
p3-> data = a;
p2-> next = p3;
p2 = p3;
}
p2-> next = p1;

// print the list
p3 = p1-> next;
while(p3 && p3 != p1)
{
cout < < p3-> data < < " ";
p3 = p3-> next;
}
cout < < endl;

// reverse the cyclic list
p3 = p1-> next;
p2 = p1;
while(p3 && p3 != p1)
{
mr_node* tmp = p3-> next;
p3-> next = p2;
p2 = p3;
p3 = tmp;
}
p1-> next = p2;

// print the reversed list
p3 = p1-> next;
while(p3 && p3 != p1)
{
cout < < p3-> data < < " ";
p3 = p3-> next;
}
cout < < endl;

return 0;

[解决办法]
一本书上的单链表逆置程序:(单链表带附加头结点)
方法是在头结点和第一个存放数据的结点之间不断插入后边的元素结点。
void nizhi(Lnode *head)
{
p=head-> next;
head-> next=NULL;
while(p!=NULL)
{
q=p-> next;
p-> next=head-> next;
head-> next=p;
p=q;
}
}
------------------
揭帖给分.呵呵
[解决办法]
只需要修改next指针,
前者变为后者
[解决办法]
楼主,单链表的建立,逆置,输出,我都给你写好了,下面的程序直接就可以用

#include <iostream.h>
typedef struct List
{
int data;
int size;
struct List *next;
}*SqList,SNode;

SqList CreateList(int n) //建立有n个节点的单链表
{
SqList q,Pnew,H;
H=(SqList)malloc(sizeof(SNode));
H-> next=NULL;
H-> size=n;
q=H;
cout < < "input " < <n < < " datas of this SqList " < <endl;
for(int i=0;i <n;i++)
{
Pnew=(SqList)malloc(sizeof(SNode));
cin> > Pnew-> data;
q-> next=Pnew;
Pnew-> next=NULL;
q=Pnew;
}
return H;
}

void Reverse(SqList L) //逆置该链表,
{
SqList p,q,h;
h=L;
p=h-> next;
h-> next=NULL; //先将表头下一个节点保存,再将表头指向NULL
while(p!=NULL)
{
q=p-> next;
p-> next=h-> next; //保存第一节点的下一节点,再将第一节点指向表头的
//下一项
h-> next=p; //表头下一项指向第一节点
p=q; //第一节点向后移,至第二节点
}
}

void OutPut(SqList L) //输出链表
{
SqList p;
p=L-> next;
if(p==NULL)
{
cout < <endl < < "empty in OutPut " < <endl;
return;
}
while(p!=NULL)
{
cout < <p-> data < < " ";


p=p-> next;
}
cout < <endl;
}

void main()
{
SqList H;
int n;
cout < < "how many datas do you want to have in this list? " < <endl;
cin> > n;
H=CreateList(n);
cout < < "the list is: " < <endl;
OutPut(H);
cout < < "after reverse, the list is: " < <endl;
Reverse(H);
OutPut(H);
}
[解决办法]
这是我们c老师布置的作业,呵呵,这个程序可以实现不少功能,我也是初学,编了好久呢


#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
struct stu
{
char num[20];
char name[20];
stu *next;
};
stu * creat(); //函数声明
void list(stu *head);
int f(stu * head);
stu * fv(stu * head);
stu * sreach(stu * head);
stu * insert(stu * head);
stu * del(stu * head);
void copy(stu *p1,stu *&p2);
void release(stu * head);

void main()
{
stu * head;
head=creat();
list(head);
char i;
bool state=1;
while(1)
{
cout < < "请选择要进行的操作: " < <endl
< < "1为查结点个数;2为倒序;3为检索;4为插入节点; " < <endl < < "5为删除节点;6为复制;7为释放空间,结束程序 " < <endl;
fflush(stdin);
i=getche();
cout < <endl;
switch(i)
{
case '1 ':
int n;
n=f(head);
cout < < "结点个数为 " < <n < <endl;
break;
case '2 ':
head=fv(head);
state=!state;
list(head);
break;
case '3 ':
stu *p;
p=sreach(head);
if((head!=NULL)&&(p==NULL))
cout < < "该学号不存在 " < <endl;
else if(head!=NULL)
cout < < "该学生姓名为 " < <p-> name < <endl;
break;
case '4 ':
if(state)
{
head=insert(head);
list(head);
cout < < "结点个数为 " < <f(head) < <endl;
}
else
cout < < "倒序状态下无法进行插入操作 " < <endl;
break;
case '5 ':
if(head==NULL) cout < < "链表为空 " < <endl;
else
{
del(head);
list(head);
cout < < "结点个数为 " < <f(head) < <endl;
}
break;
case '6 ':
stu *head2;
head2=NULL;
copy(head,head2);
list(head2);
break;
case '7 ':
release(head);
return;
default:
cout < < "输入错误 " < <endl;
}
}
}
struct stu *creat() //创建链表函数
{
char temp[20];
int n=0;
stu *p,*p1,*p2,*head=NULL;

cout < < "下面开始建立链表,输入第一个学生学号(注意每次输入的学号位数应一致),-1为退出 " < <endl;
cin> > temp;
if (strcmp(temp, "-1 ")==0) return(head);

do
{
if(n!=0)
{
cout < < "输入下一个学生学号,-1为退出 " < <endl;
gets(temp);
if (strcmp(temp, "-1 ")==0) return(head);

}

n++;
if(n==1)
{
head=new stu;
strcpy(head-> num,temp);
cout < < "输入姓名 " < <endl;
gets(head-> name);
head-> next=NULL;
}
else
{
p=head;
p2=head;
p1=new stu;


strcpy(p1-> num,temp);
cout < < "输入姓名 " < <endl;
gets(p1-> name);
if(strcmp(p1-> num,head-> num) <0)
{
p1-> next=head;
head=p1;
continue;
}
while(strcmp(p1-> num,p-> num)> 0)
{
p2=p;
p=p-> next;
if(p==NULL)break;
}
if((p!=NULL)&&(strcmp(p1-> num,p-> num)==0))
{
cout < < "该学号已存在,请重新输入 " < <endl;
delete p1;
continue;
}
p1-> next=p;
p2-> next=p1;
}
}while(1);
}
void list(stu *head) //输出链表函数
{
if(head==NULL)
cout < < "链表为空 " < <endl;
else
{
stu *p;
p=head;
while(p!=NULL)
{
cout < < "学号 " < <p-> num < < "其姓名为 " < <p-> name < <endl;
p=p-> next;
}
}
}
int f(stu * head) //计数函数
{
int n=0;
stu *p=head;
while(p!=NULL)
{
n++;
p=p-> next;
}
return(n);
}

stu * fv(stu * head) //倒序函数
{
stu *p1,*p2,*p3;
if((head==NULL)||(head-> next==NULL)) return(head);
else
{
p1=head;
p2=p1-> next;
p3=p2-> next;
head-> next=NULL;
while(p3!=NULL)
{
p2-> next=p1;
p1=p2;
p2=p3;
p3=p3-> next;
}
p2-> next=p1;
head=p2;
return(head);
}
}

stu * sreach(stu * head) //检索函数
{
if(head==NULL)
{
cout < < "链表为空,无记录 " < <endl;
return(head);
}
stu *p;
p=head;
char temp[20];
cout < < "输入要检索的学生学号 " < <endl;
gets(temp);
while(p!=NULL)
{
if(strcmp(p-> num,temp)==0)
return(p);
else p=p-> next;
}
return(p);

}
stu * insert(stu * head) //插入节点函数
{
char temp[20];
cout < < "输入要插入的学号 " < <endl;
gets(temp);


if(head==NULL)
{
head=new stu;
strcpy(head-> num,temp);
cout < < "输入姓名 " < <endl;
gets(head-> name);
head-> next=NULL;
}
else
{
stu *p1;
p1=new stu;
strcpy(p1-> num,temp);
cout < < "输入姓名 " < <endl;
gets(p1-> name);
if(strcmp(p1-> num,head-> num) <0)
{
p1-> next=head;
head=p1;
return(head);
}
stu *p,*p2;
p=head;
p2=head;
while(strcmp(p1-> num,p-> num)> 0)
{
p2=p;
p=p-> next;
if(p==NULL)break;
}
if((p!=NULL)&&(strcmp(p1-> num,p-> num)==0))
{
cout < < "错误!该学号已存在 " < <endl;
delete p1;
return(head);
}
p1-> next=p;
p2-> next=p1;
}
return(head);
}
stu * del(stu * head)//删除节点函数
{
stu *p,*p1;
p=head;
char temp[20];
cout < < "输入要删除的学生学号 " < <endl;
gets(temp);
while(p!=NULL)
{
if(strcmp(p-> num,temp)==0)
{
p1-> next=p-> next;
delete p;
return(head);
}

else
{
p1=p;
p=p-> next;
}
}
cout < < "没有找到该学号 " < <endl;
return(head);
}
void copy(stu *p1,stu *&p2)//复制函数
{
if(p1==NULL)


{
p2=NULL;
return;
}
else
{
p2=new stu;
strcpy(p2-> name,p1-> name);
strcpy(p2-> num,p1-> num);
copy(p1-> next,p2-> next);
}
}


void release(stu * p)//释放空间,结束程序
{
stu *p1=p;
if(p==NULL)
{
cout < < "链表为空 " < <endl;
return;
}
if(p-> next!=NULL)
{
p1=p-> next;
delete(p);
release(p1);
}
else
{
delete(p);
return;
}
}


[解决办法]
将头结点摘下来,然后采用前插法依次插入。例如

初始: head -> 1 -> 2 -> 3
第一步: head
第二步: head -> 1
第三步: head -> 2 -> 1
第四步: head -〉3 -〉2 -〉1

程序如下:

#include <iostream.h>
#include <string.h>

typedef struct GLinkList {
char szdata[6];
struct GLinkList *next;
}GLinkList, *LinkList;

LinkList pHead = new GLinkList;

LinkList CreateLink()
{
char sztemp[6];

LinkList pNew = new GLinkList;
LinkList pEnd = pNew-> next;
pEnd = pNew;
pHead-> next = pEnd;

cout < <( "Please input linklist data , end of \ "end\ "! ") < <endl;

memset(sztemp,0,sizeof(sztemp));
cin> > sztemp;
strcpy(pNew-> szdata,sztemp);

while(0 != strcmp(pNew-> szdata, "end ")) {
pEnd-> next = pNew;
pEnd = pNew;

pNew = new GLinkList;

memset(sztemp,0,sizeof(sztemp));
cin> > sztemp;
strcpy(pNew-> szdata,sztemp);


} ;

pEnd-> next = NULL;
delete pNew;
return pHead;


}

void ShowLinkList(LinkList pHead)
{
cout < <( "The item of List are ") < <endl;

while (pHead-> next) {
cout < <pHead-> next-> szdata < <endl;
pHead = pHead-> next;
}

}

void DelLinkList(LinkList pHead)
{
cout < <( "The item of List are ") < <endl;
LinkList p=pHead,q=pHead;

while (p) {
p = p-> next;
delete q;
q=p;
}

}

LinkList ReverseLink(LinkList pHead)
{
LinkList p = pHead-> next;

pHead-> next = NULL;

while (p) {
LinkList q=p;
p = p-> next;

q-> next = pHead-> next;
pHead-> next = q;

}

return pHead;
}


void main()
{

ShowLinkList(CreateLink());
ReverseLink(pHead);
ShowLinkList(pHead);
}
[解决办法]
单链表的逆置,用的着楼上的那么麻烦吗,只要一个算法就可以了:
//struct node *p;
//struct node *q;

void nizhi(struct node *head)
{
p = head-> next;
head-> next = NULL;
while(p != NULL)
{
q = p-> next;
p = head-> next;
head-> next = p;
p = q;
}
}
[解决办法]
还不揭帖?给分?
[解决办法]
楼上的错了吧?
我是不是可以理解为head-> next = NULL;

我的核心代码,前插法最简单的方式了。

LinkList ReverseLink(LinkList pHead)
{
LinkList p = pHead-> next;

pHead-> next = NULL;



while (p) {
LinkList q=p;
p = p-> next;

q-> next = pHead-> next;
pHead-> next = q;

}

return pHead;
}

[解决办法]

比较简单的逆转
fp=head;
p=fp-> next;
if (p!=null)
{
while(p-> next!=null)
{
np=p-> next;
p-> next=fp;
fp=p;
p=np;
}
if (p-> next=null)
p-> next=fp;
}
head=p;
fp:前指针;p:当前指针;np后指针

[解决办法]

比较简单的逆转 上面掉了一条语句 将头节点NEXT置空
fp=head;
p=fp-> next;
fp-> next=null;
if (p!=null)
{
while(p-> next!=null)
{
np=p-> next;
p-> next=fp;
fp=p;
p=np;
}
if (p-> next=null)
p-> next=fp;
}
head=p;
fp:前指针;p:当前指针;np后指针
[解决办法]
我感觉前插最简单了。odistance(零距离) 说的很简洁阿。

热点排行