![]() |
#2
wengbin2016-01-14 10:41
![]() #include<iostream> using namespace std; typedef struct Lnode { //链表节点 int data; Lnode *next; }Lnode; class Llist { //链表类 private: Lnode *head, *tail; public: Llist(int x); void ReverseLinkList(); void show(); }; Llist::Llist(int x) { Lnode *nitem; head = new Lnode; head->data=0;///原码没有读入第一个节点的data值 head->next = NULL; tail = head; for (int i = 1; i <= x; i++) {///注意,此处完成后可一共有x+1个节点,写法不够简单明朗 nitem = new Lnode(); nitem->data = i; nitem->next=NULL; tail->next = nitem; tail = nitem; } } void Llist::show() { Lnode*p=head;///原码这里是有问题的,会浪费掉第一个没给值的节点,一不注意可能不会发现 while (p->next!= NULL){ cout << p->data << " "; p = p->next; } cout<<p->data; cout << endl; } void Llist::ReverseLinkList() { //将第一个节点提取出来插入尾部,直到原本的尾节点为止 //本题经改过后不可能为空节点,如果想达到可以为空节点,创造链表的过程不是你这样的。 Lnode *head1=NULL,*p1=NULL,*p2=NULL,*flag=NULL; if(head==tail) return;//只有一个节点 else if(head->next==tail)//有两个节点 { p2=head; head=tail; head->next=p2; tail=p2; tail->next=NULL; } else { head1=tail; p1=head; while(head->next!=tail)//未倒置节点多于两个时 { while(p1->next->next!=NULL) { p1=p1->next; } flag=p1; p1=p1->next; p1->next=flag; flag->next=NULL; tail=flag; p1=head; } flag->next=p1; p1->next=NULL; head=head1; } } int main() { Llist L1(0); L1.show(); L1.ReverseLinkList(); L1.show(); cout<<endl; Llist L2(1); L2.show(); L2.ReverseLinkList(); L2.show(); cout<<endl; Llist L3(5); L3.show(); L3.ReverseLinkList(); L3.show(); return 0; } [此贴子已经被作者于2016-1-14 11:02编辑过] |
数据结构的作业,将一个链式堆栈里的元素倒置,不知道怎么就是报错
#include<iostream>
using namespace std;
typedef struct Lnode { //链表节点
int data;
Lnode *next;
}Lnode;
class Llist { //链表类
private:
Lnode *head, *tail;
public:
Llist(int x);
void ReverseLinkList();
void show();
};
Llist::Llist(int x) {
Lnode *nitem;
head = new Lnode;
head->next = NULL;
tail = head;
for (int i = 1; i <= x; i++) {
nitem = new Lnode();
nitem->data = i;
tail->next = nitem;
tail = nitem;
}
}
void Llist::show() {
Lnode *p = head->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void Llist::ReverseLinkList() { //将第一个节点提取出来插入尾部,直到原本的尾节点为止
if (head->next = NULL) {
cout << "链表为空" << endl; return;
}
Lnode *tem = head->next, *ptail = tail;
while (tem != ptail) {
getchar();
head->next = tem->next;
tail->next = tem;
tail = tem;
tem = head->next;
}
}
int main()
{
Llist L1(5);
L1.show();
L1.ReverseLinkList();
L1.show();
return 0;
}
求救!