数据结构线性表

 

一、顺序表

顺序表结构体定义:

typedef struct {

        int data[maxSize];        //        #define maxSize 100

        int length;

}Sqlist;

常见定义:

int data[maxsize];

顺序表操作:

插入数据元素:

在顺序表的p位置插入新数据元素x,成功返回1,不成功返回0:

 

int insertElem( Sqlist &L,int p,int x ){

        if( p<0 || p>L.length || L.length==maxSize )

                 return 0;

        for( int i  = L.length-1; i>=p; i-- )

                L.data[i+1] = L.data[i];

        L.data[p] = x;

        ++(L.length);

        return 1; 

}

查找数据元素值:

按照元素值查找返回下标

int  findElem( Sqlist L ,int x ){

        for( int i = 0;i<L.length;i++ ){

                if( L.data[i]==x )

                return i;

        }        

        return -1;        //        没找到,返回-1标记

}

删除数据元素:

删除下标为p 的数据 成功返回1,失败返回0;将被删除元素赋给x.

int deleteElem( Sqlist &L , int p , int &x){

       if( p<0 || p>length-1) return 0 ;

        x = L.data[p];

        for( int i = p; i<L.length-1; i++ )

                L.data[i] = L.data[i+1];

        --(L.length);

        return 1;

}

二、链表

1.单链表

单链表节点定义:

typedef struct LNode{

        int data;

        struct LNode *next;

}LNode;

尾插法建立单链表:

void createlistR(LNode *& c , int a[] ,int n){

       LNode *p, *q;

        c = (LNode *)malloc(sizeof(LNode));

        c->next = NULL;

        q = c;

        for( int i = 0 ; i<n ; i++){

             p = (LNode *)malloc(sizeof(LNode));

             p->data = a[i];

             q->next = p;

              q = q->next;

        }

        q->next = NULL;

}

头插法建立单链表:

void createlistF(LNode *&c ,int a[] ,int n){

        LNode *p ;

        c = (LNode *)malloc(sizeof(LNode));

        c->next = NULL;

        for ( int i = 0;i<n;i++){

                p = (LNode *)malloc(sizeof(LNode));

                p->data = a[i];

                p->next = c->next;

                c->next = p;

        }

}

头插法建立单链表:

2.双链表

双链表节点定义:

typedef struct DLNode{

        int data;

        struct DLNode *prior;

        struct DLNode *next;

}DLNode;

采用尾插法建立双链表:

void createDlistR( DLNode *&L ,int a[] ,int n){

        DLNode *p,*q;

        L = (DLNode *)malloc(sizeof(DLNode));

        L->next = NULL;

        L->prior =NULL;

        p = L;

        for( int i = 0; i<n ; i++){

                q = (DLNode *)malloc(sizeof(DLNode));

                q->data = a[i];

                q->prior = p;

                p->next = q;

                p = p->next;

        }

        p->next = NULL;

}

查找节点:

查找值为x的节点返回节点指针:

DLNode* findNode ( DLNode *C ,int x){

        DLNode *p = C->next;

       while(p!=NULL){

                if( p->data==x )

                        break;

                p = p->next;     

        }

         return p;

}

插入结点:

在p所指节点后插入一个s节点:

s->next = p->next;

s->prior = p;

p->next = s;

s->next->prior = s; 

7123de8aaee44529951ad3ec662c3780.png

 

删除结点:

删除双链表p的后继节点:

q = p->next;

p->next = q->next;

q->next->prior = p;

free(q);

9d0d371614b64e98a82ef7d2d2b0389b.png

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值