数据结构之 链表

/* main.cpp
 * 测试链表
*/



#include
<stdio.h>
#include
<iostream.h>
#include
<string.h>
#include
<stdlib.h>


#include
"element.h"
#include
"list.h"


void main(int ac,char *av[]){
    List l(
sizeof(struct element));
    
char name[4][MAX_NAME]={"bluce","jone","kbb","huffman"};
    
struct element e[4],tmp;
    
int n,loc;
    cout
<<"+++++++++++++++++ 测试函数 isEmpty, length, insert, show +++++++++++++++++"<<endl;
    cout
<<"任意键开始"<<endl;
    getchar();
    cout
<<"isEmpty 的返回值: "<<l.isEmpty()<<endl;
    cout
<<"length 的返回值: "<<l.length()<<endl;
    
    
for(n=0;n<4;n++){
        e[n].no
=n+1;
        strcpy(e[n].name,name[n]);
        l.insert(
&e[n]);
        l.show();
    }

    l.insert(
&e[0]);
    l.show();
    cout
<<"isEmpty 的返回值: "<<l.isEmpty()<<endl;
    cout
<<"length 的返回值: "<<l.length()<<endl;
    cout
<<"+++++++ 测试函数 locateElement, getElement, priorElement,nextElement ++++++"<<endl;
    cout
<<"任意键开始"<<endl;
    getchar();
    
for(n=0;n<4;n++){
        cout
<<"locateElement 的返回值:号码是 "<<n<<" 的元素的位置在 "<<l.locateElement(&e[n])<<endl;
    }

    
for(n=0;n<4;n++){
        l.getElement(
&tmp,n);
        cout
<<"getElement 的返回值:号码是 "<<n<<" 的元素的信息"<<endl;
        showElement(
&tmp);
    }

    
for(n=0;n<4;n++){
        l.priorElement(
&e[n],&loc);
        cout
<<"priorElement 的返回值:号码是"<<n<<"的前一个元素的位置: "<<loc<<endl;
    }

    
for(n=0;n<4;n++){
        l.nextElement(
&e[n],&loc);
        cout
<<"nextElement 的返回值:号码是"<<n<<"的下一个元素的位置: "<<loc<<endl;
    }

    cout
<<"+++++++++++++++++++ 测试函数 del, clearList +++++++++++++++++++++++"<<endl;
    cout
<<"任意键开始"<<endl;
    getchar();
    l.show();
    l.del(
&e[0]);
    l.show();
    l.del(
&e[3]);
    l.show();
    l.del(
&e[2]);
    l.show();
    l.clearList();
    cout
<<"调用clearList 以后:"<<endl;
    l.show();
}

 

 

/* elememt.h
 * 定义一个用来测试数据
*/


#define MAX_NAME 20

struct element{
    
int no;
    
char name[MAX_NAME];
}
;

//定义如何显示该结构体
void showElement(const void *dt){
    
struct element *e=(struct element *)dt;
    cout
<<"NO. "<<e->no<<" NAME: "<<e->name<<endl;
}

//定义如何判断两个结构体是否相等
int compareElement(const void *d1,const void *d2){
    
struct element *e1,*e2;
    e1
=(struct element *)d1;
    e2
=(struct element *)d2;
    
return e1->no-e2->no;
}

 

/* list.h
 * 定义并实现通用链表类
*/


#define oope(msg)    {perror(msg);exit(1);}


//链表类
class List{
private:
    
/* 定义数据结构,head指向表头节点,bottom指向链表最后一个节点所在的位置,以便向链表插入数据 */
    
struct member{
        
void *element;
        
struct member *next;
    }
head,*bottom;
    
/* size 是data的大小,len 表示当前链表中元素的个数 */
    
int size,len;    
public:
    List(
int);    //初始化链表
    ~List();    //释放链表
    void show(void);    //打印链表
    void clearList(void);    //清空链表
    int isEmpty(void);    //判断链表是否为空
    int length(void);    //返回当前链表中数据元素的个数
    int getElement(void *dt,int n);    //得到链表中第n个数并复制给dt
    int locateElement(const void *dt);    //返回链表链表中值等于dt的元素的位置
    int priorElement(const void *cur,int *pos);    //将链表中值等于dt的元素的前驱位置复制给pos
    int nextElement(const void *cur,int *pos);    //将链表中值等于dt的元素的后继位置复制给pos
    int insert(const void *dt);    //向链表中插入值等于dt的元素
    int del(const void *dt);    //从链表中删除值等于dt的元素
}
;


List::List(
int s){
    size
=s;
    len
=0;
    head.next
=NULL;
    bottom
=&head;
}


void List::clearList(){
    
if(len==0)    return;
    
int n;
    
struct member  *pre,*aft;
    pre
=head.next;
    aft
=pre->next;
    
for(n=0;n<len;n++){
        free(pre);
        pre
=aft;
        
if(aft)    aft=aft->next;
    }

    len
=0;
    head.next
=NULL;
    bottom
=&head;
}


List::
~List(){
    clearList();
}


int List::locateElement(const void *dt){//如果成功返回dt所在的位置,否则返回-1
    int n;
    
struct member  *loc;
    loc
=head.next;
    
for(n=0;n<len;n++){
        
if(compareElement(dt,loc->element)==0)    return n;
        loc
=loc->next;
    }

    
return -1;
}


int List::insert(const void *dt){//if success return location where insert else return -1 
    int pos;
    
if((pos=locateElement(dt))!=-1){
        cout
<<"can not insert data beacuse it has been exist"<<endl;
        
return -1;
    }

    
struct member *tmp;
    tmp
=(struct member *)malloc(sizeof(struct member));
    
if(tmp==NULL){
        perror(
"insert error: ");
        
return -1;
    }

    tmp
->element=malloc(size);
    memcpy(tmp
->element,dt,size);    
    tmp
->next=NULL;
    
if(len==0){
        bottom
=head.next=tmp;
    }

    
else{
        bottom
->next=tmp;
        bottom
=tmp;
    }

    
return ++len;
}


void List::show(){
    
int n;
    
struct member * tmp;
    cout
<<"----------------------------------------------------"<<endl;
    cout
<<"there are "<<len<<" heads in the list"<<endl;
    tmp
=head.next;
    
for(n=0;n<len;n++){
        showElement(tmp
->element);
        tmp
=tmp->next;
    }

    cout
<<"----------------------------------------------------"<<endl;
}



int List::isEmpty(){
    
return len;
}


int List::length(){
    
return len;
}


//调用成功返回0,否则返回-1
int List::getElement(void *dt,int n){    
    
int loc;
    
struct member  *tmp;
    
if(n<0 || n>=len)    return -1;
    tmp
=head.next;
    
for(loc=0;loc<n;loc++)
        tmp
=tmp->next;
    
if(memcpy(dt,tmp->element,size)==NULL)    return -1;
    
return 0;
}


//调用成功返回0,否则返回-1
int List::priorElement(const void *cur,int *pos){
    
int n;
    
struct member  *tmp=head.next;
    
for(n=0;n<len;n++){
        
if(compareElement(cur,tmp->element)==0)  {*pos=n-1;return 0;}
        tmp
=tmp->next;
    }

    
return -1;
}



//如果成功返回元素的后继位置,否则返回-1
int List::nextElement(const void *cur,int *pos){
    
int n;
    
struct member *tmp=head.next;
    
for(n=0;n<len;n++,tmp=tmp->next)
        
if(compareElement(cur,tmp->element)==0)  {*pos=n+1;return 0;}
    
return -1;
}


//删除元素,成功放回0,否则返回-1
int List::del(const void *dt){
    
if(len==0){
        cout
<<"nothing to delete, list is empty"<<endl;
        
return -1;
    }

    
struct member *tmp=&head,*t;
    
int flag=-1;
    
while(tmp){
        
if(memcmp(tmp->next->element,dt,size)==0){
            
if(bottom==tmp->next) {
                bottom
=tmp;
                free(tmp
->next);
                tmp
->next=NULL;
            }

            
else{
                t
=tmp->next;
                tmp
->next=tmp->next->next;
                free(t);
            }

            flag
=0;
            len
--;
            
break;
        }

        
else{
            tmp
=tmp->next;
        }

    }

    
return flag;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值