找回密码
 入驻
搜索
查看: 1170272|回复: 21

[09-26] 数据结构,用C++描述更精彩!

[复制链接]
发表于 2006-9-26 20:58:51 | 显示全部楼层 |阅读模式
线性表:
/*****链式表的实现和操作*****/
//作者:zkkpkk
#include <iostream.h>
class Linklist//定义链表类
{
public:
Linklist* next;
Linklist()
{
  next=NULL;
}
int data;
void Push(Linklist** refhead,int data);//添加节点
void Insert(Linklist* head,Linklist* pio);//插入节点
void Display(Linklist* head);//显示链表
int Length(Linklist* head);//统计节点数目
Linklist* Find(Linklist* head,int data);//查找节点地址
void Delete(Linklist* head,int data);//删除节点
};
Linklist* head=new Linklist;
void Linklist::Insert(Linklist* head,Linklist* pio)
{
Linklist *cur,*bef;
cur=bef=head;
while(cur != NULL)
{ if(cur->data >= pio->data)
   break;
  else
  {bef=cur;
  cur=cur->next;
  }
}
if(cur==head)
{ pio->next=head;
  head=pio;
}
else
{
  bef->next=pio;
  pio->next=cur;
}
}
Linklist* Linklist::Find(Linklist* head,int data)
{
bool bo=true;
Linklist* cur;
cur=head;
while(cur != NULL)
{
  if(cur->data==data){
  bo=false;
  return cur;}
cur=cur->next;
}
if(bo==true){
  cout<<"It is no have the Linklist!"<<endl;
  return NULL;
}
}
int Linklist::Length(Linklist* head)
{
int count=0;
Linklist* cur;
cur=head;
while(cur != NULL)
{
  cur=cur->next;
  count++;
}
return count;
}
void Linklist::Push(Linklist** refhead,int data)
{
Linklist* newLinklist=new Linklist;
newLinklist->data=data;
newLinklist->next=*refhead;
*refhead=newLinklist;
}
void Linklist::Display(Linklist* head)
{
Linklist *temp=new Linklist;
temp=head;
if(temp==NULL)
  cout<<"The Linklist is empty!"<<endl;
else
{
  while(temp!=NULL)
  {
   cout<<temp->data<<"\t";
   temp=temp->next;
  }
  cout<<endl;
}
}
void Linklist::Delete(Linklist* head,int data)
{
Linklist *cur,*bef;
cur=bef=head;
while(cur != NULL)
{
  if(cur->data==data)
   break;
  else
  {
   bef=cur;
   cur=cur->next;
  }
}
if(cur==head)
{
  cur->next=head;
  delete cur;
}
else
{
  bef->next=cur->next;
  delete cur;
}
}

栈:
/*****顺序栈的实现和操作*****/
//作者:zkkpkk
#include <iostream.h>
#define maxsize 64
class Stack//栈类型
{
public:
int data[maxsize];
int top;
int buttom;
Stack()
{
  top=-1;
}
bool empty();//判断栈空
void Push(Stack* s,int data);//进栈
void Pop();//出栈
int Gettop(Stack* s);//取栈顶
};
Stack* s=new Stack;
bool Stack::empty()
{
if(s->top==s->buttom)
  return true;
else
  return false;
}
void Stack::Push(Stack* s,int data)
{
Stack* cur;
cur=s;
if(cur->top==maxsize-1)
{ cout<<"Over Flow!";
  return;
}
else
{
  s->top++;
  s->data[s->top]=data;
}
}
void Stack::Pop()
{
if(s->empty()==true)
{
  cout<<"Under Flow!";
  return;
}
else
{
  s->top--;
  s->data[s->top+1];
}
}
int Stack::Gettop(Stack* s)
{
Stack* cur;
cur=s;
if(cur->empty()==true)
{
  cout<<"The Stack is empty!";
  return 0;
}
else
  return cur->data[cur->top];
}

/*****共享顺序栈的实现与操作*****/
#include <iostream.h>
#define maxsize 64
class Stack//定义栈类
{
public:
int data[maxsize];
int top1,top2;
Stack()
{
  top1=-1;
  top2=maxsize;
}
void Push(Stack* s,char *ch,int data);//进栈
void Pop(Stack* s,char *ch);//出栈
};
Stack* s=new Stack;
void Stack::Push(Stack* s,char *ch,int data)
{
Stack* cur;
cur=s;
if(cur->top2-cur->top1==1)
{
  cout<<"The Stack is fall!";
  return;
}
else
{
  if(ch=="s1")
  {
   cur->top1=cur->top1+1;
   cur->data[cur->top1]=data;
   return;
  }
  if(ch=="s2")
  {
   cur->top2=cur->top2-1;
   cur->data[cur->top2]=data;
   return;
  }
}
}
void Stack::Pop(Stack* s,char *ch)
{
Stack* cur;
cur=s;
if(ch=="s1")
{
  if(cur->top1<0)
  {
   cout<<"The Stack is empty!";
   return;
  }
  else
  {
   cur->top1--;
   cur->data[cur->top1+1];
  }
}
if(ch=="s2")
{
  if(cur->top2>maxsize-1)
  {
   cout<<"The Stack is empty!";
   return;
  }
  else
  {
   cur->top2++;
   cur->data[cur->top2-1];
  }
}
}
 楼主| 发表于 2006-9-26 20:59:52 | 显示全部楼层
/*****链式栈的实现与操作*****/
#include <iostream.h>

class Linkstack//定义链栈类
{
public:
        int data;
        Linkstack* next;
        Linkstack()
        {next=NULL;}
        void Push(Linkstack* top,int data);//进栈操作
        void Pop(Linkstack* top,int *s);//出栈操作
};
Linkstack* top=new Linkstack;

void Linkstack::Push(Linkstack* top,int data)
{
        Linkstack* cur;
        Linkstack* t;
        t=top;
        cur=NULL;
        cur->data=data;
        cur->next=t;
        t=cur;
}
void Linkstack::Pop(Linkstack* top,int *s)
{
        Linkstack* cur;
        Linkstack* t;
        cur=NULL;
        t=top;
        if(t==NULL){
                cout<<"The stack is empty!";
                return;
        }
        else
        {
                *s=t->data;
                cur=t;
                t=t->next;
                delete cur;
        }
}

队列:
/*****顺序队列的实现和操作*****/
#include <iostream.h>
#define maxsize 24

class Queue
{
private:
        int front;//队头
        int rear;//队尾
        int data[maxsize];
public:
        Queue()
        {
                front=rear=-1;
        }
        bool Empty();//判空
        int Delqueue();//头部删除
        void Insert(int data);//尾部插入
};
Queue* q=new Queue;
bool Queue::Empty()
{
        if(q->front==q->rear)
                return true;
        else
                return false;
}
void Queue::Insert(int data)
{
        if(q->rear>=maxsize-1)
                cout<<"The queue is full!";
        else
        {
                (q->rear)++;
                q->data[q->rear]=data;
                return;
        }
}
int Queue::Delqueue()
{
        if(q->Empty()==true)
        {
                cout<<"The queue is empty!";
                return 0;
        }
        else
        {
                (q->front)++;
                return q->data[q->front];
        }
}

[[i] 本帖最后由 zkkpkk 于 2006-9-26 21:00 编辑 [/i]]
回复

使用道具 举报

发表于 2006-9-26 21:02:29 | 显示全部楼层
:L :L :L

计算机系的高高手吧!!!

上面那些看了我头晕!!!
回复

使用道具 举报

发表于 2006-9-26 21:04:08 | 显示全部楼层
眼花了~专业术语不要出现在这里啊~大多数人看不懂啊
回复

使用道具 举报

发表于 2006-9-26 21:06:21 | 显示全部楼层
LZ考程序员了吗???难不,俺过一年也想考考,可是现在对什么都懒懒滴!!!:(
回复

使用道具 举报

发表于 2006-9-26 21:15:42 | 显示全部楼层
:L 看8懂,我的方向是网络
回复

使用道具 举报

发表于 2006-9-26 21:30:42 | 显示全部楼层
555~~楼上滴怎么方向那么明确啊,我以前都不知我方向是哪里,我还是刚刚想明白我方向是哪了!!!:lol :lol :lol 就是吃饭!!!:victory:
回复

使用道具 举报

 楼主| 发表于 2006-9-26 21:47:00 | 显示全部楼层
:( 国家程序员明年有报名,我离程序员还远呢,我看过那方面的书,要考的东西很多,等大三再考吧
回复

使用道具 举报

 楼主| 发表于 2006-9-26 21:50:10 | 显示全部楼层
原帖由 壹哖偂ヤ 于 2006-9-26 21:04 发表
眼花了~专业术语不要出现在这里啊~大多数人看不懂啊

这个版就是发这些滴,大家一人发一贴,一眼看下去一版都是C++,C#,JAVA的不好看吗:)
回复

使用道具 举报

发表于 2006-9-26 22:14:35 | 显示全部楼层
LZ也是大二的?,大二就那么厉害啊!!!真是敬佩敬佩哦!!!

唉~~我怎么就什么也不懂呢!烦恼哦.
回复

使用道具 举报

 楼主| 发表于 2006-10-16 11:27:53 | 显示全部楼层

[更新]加入链表排序函数

增加宏定义#define LEN 50
将void Sort(Linklist* head,int mark);添加到类中

//对链表进行有序的排序,mark>0时升序mark>=0时降序
void Linklist::Sort(Linklist* head,int mark)
{
        int a[LEN+1];
        int k,t;
        Linklist* cur;
        cur=head->next;
        for(k=0;cur!=NULL;k++,cur=cur->next)
                a[k]=cur->data;
        for(int i=0;i<k;i++){
                for(int j=0;j<k-i;j++)
                {
                        if((mark>0 && a[j]>a[j+1]) || (mark<=0 && a[j]<a[j+1]))
                        {
                                t=a[j];
                                a[j]=a[j+1];
                                a[j+1]=t;
                        }
                }
        }
        cur=head->next;
        for(int l=0;l<k;l++,cur=cur->next)
                cur->data=a[l];
        return;
}

这个函数实现对链表排序,但是由于水平有限,采用这种将数据取出存入数组,排数组再装回表的方法,由于数组的长度没有实现动态分配而使得当链表长度超过数组的长度时函数无法正常工作,希望有人能帮助本菜鸟改进这个算法。

[ 本帖最后由 zkkpkk 于 2006-10-16 11:34 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2006-10-23 22:26:21 | 显示全部楼层
有办法,转字符(char *a实现动态分配)再转整型入数组排序,再入表......
我呕心历血的终极广义表类快出来了,期待吧:loveliness:

[ 本帖最后由 zkkpkk 于 2006-10-23 22:28 编辑 ]
回复

使用道具 举报

发表于 2006-10-24 08:22:49 | 显示全部楼层
这位楼主,我想知道楼主可去外面接过项目做。。。
;P 代码方面达到商业要求的标准否?
代码重用率,开发效率。项目分析能力。。。
要是这些能搞定了,牛人一个。。。
回复

使用道具 举报

 楼主| 发表于 2006-10-24 10:33:26 | 显示全部楼层
你问问老谢,05软件的多态之王是谁:lol
回复

使用道具 举报

发表于 2006-10-24 11:31:19 | 显示全部楼层
;P 那我可就不懂了。。。小弟我经贸系的。。。
为了混口饭吃。。只好搞编程了。。。
.NET的代码别说了。现在我看不懂。水平不足,
现在向.NET转型,就好比走独木桥,走得过就活,走不过就掉下去,摔死。
汗。。。:L
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入驻

本版积分规则

QQ|Archiver|手机版|小黑屋|思明论坛

GMT+8, 2024-11-16 21:21 , Processed in 0.053886 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表