您的位置:首页 > 编程语言 > C语言/C++

链表C++实现插入、删除元素,链表逆序

2011-01-01 18:31 477 查看
#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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐