#include <iostream> #include <stdio.h> #include <stdlib.h> #define OVERFLOW -1 #define ERROR 0 #define OK 1 typedef struct LinkList { int data; LinkList *next; }LinkList; class LinklistOp { private:LinkList *list;//list为单链表的头结点 public: LinklistOp() { //if(this->list==NULL) this->list=(LinkList *)malloc(sizeof(LinkList)); this->list->next=NULL; } int LocationElm(int i,int &e)//在单链表中查找第i个结点,如果存在用e返回其值,否则报错处理 { LinkList *p=this->list->next; int j=1; while(j<i&&p!=NULL) { p=p->next; } if(p==NULL||j>i) { return ERROR; } e=p->data; return e; } //在单链表中插入一个节点 int ListInsert(int i,int e) { LinkList *s; LinkList *p=this->list; int j=0; while(j<i-1&&p!=NULL) { p=p->next; j++; } if(p==NULL||j>i-1)return ERROR; s=(LinkList *)malloc(sizeof(LinkList)); s->next=NULL; if(s==NULL)exit(OVERFLOW); s->data=e; s->next=p->next; p->next=s; //p->next=NULL; return OK; } //在单链表中删除一个结点 int ListDelete(int i,int &e) { LinkList *p,*q=list; int j=0; while(p->next!=NULL&&j<i-1) { p=p->next; j++; } if(p->next==NULL||j>i-1)return ERROR; q=p->next; p->next=q->next; free(q); return OK; } void PrintItem() { LinkList *p=this->list->next; while(p!=NULL) { printf("%d",p->data); p=p->next; } } void ReverseList() { LinkList *p=this->list->next; LinkList *q=p->next; p->next=NULL; while(q)//利用指针对链表进行截断重组,并且头指针也在移动 { p=q;// p现在指向q所指向的节点,也就是 p指向 B q=q->next;//q指向q的下一个节点 也就是C (如果没有,即为NULL) p->next=this->list->next;//p的下一个节点指向l的下一个节点 l->next => A,p => B 所以就是B指向A this->list->next=p;//l => head ,头结点的下一个节点指向p 也就是说 head指向B,一次循环结束以后 // head--B--A-- q指向的是C,如果 } } }; void main() { //LinkList *h=(LinkList *)malloc(sizeof(LinkList)); //h->data=NULL; LinklistOp *list=new LinklistOp(); int a[]={1,2,3}; for(int i=1;i<=3;i++) { list->ListInsert(i,a[i-1]); } printf("反转前的链表:"); list->PrintItem(); list->ReverseList(); printf("/n"); printf("反转后的链表:"); list->PrintItem(); }