首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

数据结构初学者,求大神支招

2013-10-30 
数据结构菜鸟,求大神支招!#includeiostreamusing namespace std#define MAX_SIZE 100struct Node{int d

数据结构菜鸟,求大神支招!
#include<iostream>
using namespace std;
#define MAX_SIZE 100

struct Node
{
int data;
Node *next;
Node( int da=0){data=da;next=NULL;};

}; 

class LinkList
{
protected:
int count; //元素个数 
Node *head; //t头结点   
void Init(int size);
public:
LinkList();
LinkList(int size);
virtual ~LinkList();
int Length();
bool SetElem(int position, int e);
Node *Locate(int position);
int GetElem(int position);
void Insert(int position,Node *n);
void Delete(int position,Node *n);
};

void LinkList::Init(int size)
{

head=new Node;
}


LinkList::LinkList()
{
count=0;
Init(MAX_SIZE);
}

LinkList::LinkList(int size)
{
count=size;
Init(size);
}

LinkList::~LinkList()
{
delete head;
}

int LinkList::Length()
{
return count;
}

Node *LinkList::Locate(int position)
{
if(position<=0 || position>Length())
   return NULL;
else
{
int cur=1;
Node *tmp,*p;
tmp=head; 
while(cur<position)
{
p=tmp;
cur++;
   tmp=p->next;
}
if(tmp!=NULL && cur==position)
   return tmp;
return NULL;
}
}

bool LinkList::SetElem(int position,int e)
{
if(position<=0 || position>Length())
   return false;
else
{
Node *tmp;
    tmp=Locate(position);
tmp->data=e; //指出这步有错????
return true;
}

}

int LinkList::GetElem(int position)
{
if(position<=0 || position>Length())
   return -1;
else
{
int cur=1,e;
Node *tmp;
tmp=head; 
    tmp=Locate(position);
   e=tmp->data;
return e;

}

}

void LinkList::Insert(int position,Node *n) //插在指定元素之后 
{
//n=new Node();
if(n==NULL)
return ;
Node *fore,*post;
count++;
fore=Locate(position);
post=Locate(position+1);
fore->next=n;
n->next=post;
}
int main()
{
LinkList la(3);
for(int i=1;i<=3;i++) 
   cout<<la.SetElem(i,i);

for( i=1;i<=3;i++)
   cout<<la.GetElem(i)<<endl;
   // cout<<la.Length();
  //  Node *p=new Node();
    
 

return 0;
}

初学数据结构,编程功底不好,现在觉得好乱,请大神详细讲解一下吧!谢谢各位大神啦!!!
[解决办法]
都是链表的基本操作,不要乱,一个一个操作区看。
比如获取元素,要先检验参数的有效性,然后获取指定结点的data。而定位 也需要先验证参数有效性,然后进行顺序查找即可。其它同理,过程在分解一下,你单步运行下就清楚了。


int LinkList::GetElem(int position)
{
if(position<=0 
[解决办法]
 position>Length())
   return -1;
else
{
int cur=1,e;
Node *tmp;
tmp=head; 
    tmp=Locate(position);
   e=tmp->data;
return e;

}

}

[解决办法]
引用:
Quote: 引用:

都是链表的基本操作,不要乱,一个一个操作区看。
比如获取元素,要先检验参数的有效性,然后获取指定结点的data。而定位 也需要先验证参数有效性,然后进行顺序查找即可。其它同理,过程在分解一下,你单步运行下就清楚了。

int LinkList::GetElem(int position)
{
if(position<=0 
[解决办法]
 position>Length())
   return -1;
else
{
int cur=1,e;
Node *tmp;
tmp=head; 
    tmp=Locate(position);
   e=tmp->data;
return e;

}

}


在那个GetElement()函数里tmp->data =e 为什么会报错?我那个指针的动态分配内存那一块不太清楚,链表里面是怎么样给每一个结点动态分配的?还有那些指针,直接就可以使用么?指向结构体的指针还用动态分配内存么?C语言没学好,不好意思,给大神添乱了,求大神指教!


指向结构体的指针要指向某个具体的结点肯定要先为该结点分配内存。然后领成员指针指向该结点。
如果是尾结点赋值NULL。
tmp通过locate得到,报错说明locate函数有问题。调下,看locate的返回的temp是否有效。

热点排行