c++用类怎么创建链表

比如创建含有10节点的链表,要求每个节点输入一个整数。类如下:classAA{private:inta;public:AA*next;};... 比如创建含有10节点的链表,要求每个节点输入一个整数。类如下:
class AA
{
private:
int a;
public:
AA *next;
};
展开
 我来答
百度网友c89dd9f984
推荐于2017-09-30 · TA获得超过4563个赞
知道大有可为答主
回答量:5241
采纳率:95%
帮助的人:1659万
展开全部

  c++创建链表,在void createList(ListNode* &pHead)的时候,用的是指针引用,因为在main中head并没有开辟空间,如果在createList中为pHead开辟空间的时候,main中的head依旧还是指向NULL的。

  参考例子:

#include<iostream>
using namespace std;
class List
{
public:
List(void):m_pHead(NULL),m_pTail(NULL){}
~List(void)
{
for(Node* pNode=m_pHead,*pNext;pNode;pNode=pNext)
{
pNext=pNode->m_pNext;
delete pNode;
}
}
//接口:追加
void Append(int nData)
{
Node* pNode=new Node(nData,m_pTail);
if(pNode->m_pPrev)
pNode->m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
m_pTail=pNode;
}
//接口:插入
void Insert(size_t uIndex,int nData)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
Node* pNode=new Node(nData,pFind->m_pPrev,pFind);
if(pNode->m_pPrev)
pNode-> m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
if(pNode->m_pNext)
pNode->m_pNext->m_pPrev=pNode;
else
m_pTail=pNode;
return;
}
throw OverBound();
}
//接口:删除
void Delete(size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
if(pFind->m_pPrev)
pFind->m_pPrev->m_pNext=pFind->m_pNext;
else
m_pHead=pFind->m_pNext;
if(pFind->m_pNext)
pFind->m_pNext->m_pPrev=pFind->m_pPrev;
else
m_pTail=pFind->m_pPrev;
delete pFind;
return;
}
throw OverBound();
}
//接口:伪随机访问/按下标访问
int operator[](size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
return pFind->m_nData;
throw OverBound();
}
//接口:遍历
void Travel(void)
{
for(Node* pNode=m_pHead;pNode;pNode=pNode->m_pNext)
cout<<pNode->m_nData<<" ";
cout<<endl;
}
private:
//异常越界
class OverBound:public exception
{
public:
const char* what(void) const throw()
{
return "链表越界!";
}
};
class Node
{
public:
Node(int nData=0,Node* pPrev=NULL,Node* pNext=NULL):m_nData(nData),m_pPrev(pPrev),m_pNext(pNext){}
int m_nData; //数据
Node* m_pPrev; //前指针
Node* m_pNext; //后指针
};
Node* m_pHead; //头节点
Node* m_pTail; //尾节点
};
int main()
{
try
{
List list;
list.Append(10);
list.Append(20);
list.Append(30);
cout<<list[0]<<endl;
cout<<list[1]<<endl;
cout<<list[2]<<endl;
// cout<<list[6]<<endl; //越界测试
list.Insert(1,15);
cout<<list[1]<<endl;
list.Delete(2);
for(size_t i=0;i<3;i++)
cout<<list[i]<<endl;
list.Travel();
}
catch(exception& ex)
{
cout<<ex.what()<<endl;
return -1;
}
return 0;
}
斜塘拂柳
2008-10-25 · TA获得超过287个赞
知道答主
回答量:68
采纳率:0%
帮助的人:31万
展开全部
vs2008编译通过,分为五个文件,创建工程,然后把各个文件放进去就行.
该代码加入文件4即可,并声明变量
//文件1:ElemType.h
typedef int ElemType;
//文件2:Pre-Compilation.h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define NULL 0
typedef int Status;
//文件3:LinkList.h
#include "ElemType.h"
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//文件4:LinkListFunc.h
#include "Pre-Compilation.h"
#include "LinkList.h"
#include<malloc.h>
#include<iostream>
using namespace std;

void CreateList_L(LinkList&L,int n){
L=(LinkList)malloc(sizeof (LNode));
L->next =NULL;
LinkList p;
for (int i=n;i>0;--i){ //声明i,p
p=(LinkList)malloc(sizeof (LNode));
cin>>p->data; //c++标准输入流
p->next = L->next;L->next = p;
}
}

Status InitList_L(LinkList &L)
//构造一个空的线性单链表L
{ L = (LinkList)malloc(sizeof(LNode));
if (!L) return OVERFLOW;
L->next= NULL;
return OK;
}//InitList_L
void DestroyList_L(LinkList &L)
//销毁已存在线性单链表L
{ LinkList p= L,q;
while (p) {
q= p->next; free(p); p=q;
}
} // DestroyList_L O(n)
void ClearList_L(LinkList &L)
//将线性单链表L重置为空表
{ LinkList p= L->next,q; L->next= NULL;
while (p) {
q= p->next; free(p); p=q;
}
} // ClearList_L O(n)
Status ListEmpty_L(LinkList L)
//判定已存在线性单链表L是否为空
{ if ( L->next ) return FALSE;
return TRUE;
}// ListEmpty_L O(1)
int ListLength_L(LinkList L)
//求线性单链表L中数据元素的个数
{ int len=0; LinkList p= L->next;
while (p) {++len; p= p->next; }
return len;
} // ListLength_L O(n
Status GetElem_L(LinkList L, int i,ElemType &e){
LinkList p=L->next;int j=1;
while(p&&j<i){
p=p->next;j++;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
}
LinkList LocateElem_L(LinkList L, ElemType e,Status (*compare)(ElemType,ElemType) )
//在线性单链表L中查找第1个值与e满足
//compare()的元素的地址指针
{ LinkList p= L->next;
while (p) {
if ( (*compare)(p->data,e) ) return p;
p= p->next;
}
return NULL; //未找到
} // LocateElem_L O(n)
LinkList PriorElem_L(LinkList L, ElemType cur_e, ElemType &pre_e)
//若cur_e是线性表L的元素且不是第一个,返回它的前驱
{ LinkList pre=L->next;
if ( !pre || !pre->next ) return NULL;
LinkList p=pre->next;
while ( p ) {
if ( p->data==cur_e ) {
pre_e= pre->data; //取前驱元素的值
return pre ; //返回前驱元素的指针
}
pre=p; p= p->next;
}
return NULL;
}//PriorElem_L O(n)
LinkList NextElem_L(LinkList L, ElemType cur_e, ElemType &next_e)
//若cur_e是线性表L的元素且不是最后一个,返回它的后继
{ LinkList p=L->next;
while ( p && !(p->data==cur_e)) p=p->next;
if ( p && p->next ) {
next_e= p->next->data ; //取后继元素的值
return p->next ; //返回后继元素的指针
}
return NULL;
}//NextElem_L O(n)

Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p=L; int j=0;
while(p&&j<i-1){p=p->next;j++;}
if(!p||j>i-1) return ERROR;
LinkList s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
return OK;
}

Status ListDelete_L(LinkList &L, int i, ElemType &e)
//在单链线性表L中删除第i个元素,并由e返回其值
{ LinkList p=L,q; int j=0;
while ( p->next && j<i-1) { p=p->next; j++; }
if ( !(p->next) || j>i-1 ) return ERROR ;
q= p->next;
p->next= q->next;
e= q->data; free(q);
return OK ;
}// ListDelete_L O(n)

/*Status PrintList_L(LinkList L)//该函数在其他实现里写的,修改后可使用
//打印已存在线性单链表L
{ if(!L->next) return ERROR;
LinkList p= L->next;
while (p) {
cout<<"第"<<p->data.number<<"号物品,重"<<p->data.weight<<endl;
p= p->next;
}
return OK;
} // PrintList_L */
//文件5:main.cpp:测试用
#include"LinkListFunc.h"
#include<stdio.h>
int main(){ //test
LinkList L;
InitList_L(L);
ListInsert_L(L,1,1);
int e;
ListDelete_L(L,1,e);
printf("%d",e);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_HappyEnding
推荐于2017-10-03 · TA获得超过830个赞
知道小有建树答主
回答量:633
采纳率:0%
帮助的人:282万
展开全部
#include <iostream>
using namespace std;

class AA
{
private:
int a;
public:
AA *next;
void input()
{
cin>>a;
}
void output()
{
cout<<a<<' ';
}
};

int main()
{
AA a[10];
AA *pHead = &a[0];
for (int i = 0;i<9;i++)
{
a[i].input();
a[i].next = &a[i+1];
}
a[9].input();
a[9].next = NULL;

do
{
pHead->output();
pHead = pHead->next;
} while (pHead != NULL);

return 0;
}
追问
用数组了耶。。。这么来链表就没意义了。。。纯属浪费
追答
#include 
using namespace std;

class AA
{
private:
int a;
public:
AA *next;
void input()
{
cin>>a;
}
void output()
{
coutinput();
q->next = NULL;
a->next = q;
a = a->next;
}

pHead = pHead->next;
do
{
pHead->output();
pHead = pHead->next;
} while (pHead != NULL);

return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式