数据结构(二)---线性表的链式存储

带表头的单链表

表头结点的定义:

typedef struct LNode

{

    int data;

    struct LNode *next;  

}LNode;

带表头结点的单链表的定义:

typedef struct HeadList

{

    LNode *head;//头节点

    int n;//链表元素的个数

}HeadList;

初始化操作

//单链表的初始化 这块没有问题

bool init(HeadList &h){

    h.head->next=NULL;

    h.n=0;

    return true;

}

查找

int find(HeadList &h,int i){

    if(i<1||i>h.n){

        return 0;

    }

    LNode *p;

    p=h.head;

    for(int j=1;j<=i;j++){

        p=p->next;

    }

    return p->data;

}

插入

/*单链表的插入*/

int insert(HeadList &h,int position,int i){

    if(position<1){

        return 0;

    }

    LNode *p=h.head;

    for(int j=1;j<=position-1;j++){

        p=p->next;

    }//此时p执行第i-1个节点

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

    z->data=i;

    z->next=p->next;

    p->next=z;

    h.n++;

    return 1;

}

删除

int shanchu(HeadList &h,int position){

    if(position<1||position > h.n){

        return 0;

    }

    LNode *p=h.head;

    for(int j=1;j<=position-1;j++){

        p=p->next;

    }//p指向第i-1个位置

    LNode*q;

    q=h.head;

    for(int x=1;x<=position;x++){

        q=q->next;

    }//q指向第i个位置

    p->next=q->next;

    h.n--;

    return 1;

}

输出

void output(HeadList &h){

    LNode*p;

    p=h.head;

    for(int i=1;i<=h.n;i++){

        p=p->next;

        cout<<p->data<<' ';

    }

}

撤销

void destory(HeadList &h){

    LNode *p;

    while (h.head)

    {

        p=h.head->next;

        free(h.head);

        h.head=p;

    }

  

}

完整程序

/*带表头的单链表的相关操作*/

#include<iostream>

// #include<stdlib.h>

using namespace std;

typedef struct LNode

{

    int data;

    struct LNode *next;  

}LNode;

  

typedef struct HeadList

{

    LNode *head;//头节点

    int n;//链表元素的个数

}HeadList;

  

//单链表的初始化 这块没有问题

bool init(HeadList &h){

    h.head->next=NULL;

    h.n=0;

    return true;

}

  

//单链表的查找

int find(HeadList &h,int i){

    if(i<1||i>h.n){

        return 0;

    }

    LNode *p;

    p=h.head;

    for(int j=1;j<=i;j++){

        p=p->next;

    }

    return p->data;

}

  

/*单链表的插入*/

int insert(HeadList &h,int position,int i){

    if(position<1||position > h.n+1){

        return 0;

    }

    LNode *p=h.head;

    for(int j=1;j<=position-1;j++){

        p=p->next;

    }//此时p执行第i-1个节点

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

    z->data=i;

    z->next=p->next;

    p->next=z;

    h.n++;

    return 1;

}

//输出操作

void output(HeadList &h){

    LNode*p;

    p=h.head;

    for(int i=1;i<=h.n;i++){

        p=p->next;

        cout<<p->data<<' ';

    }

}

//删除操作

int shanchu(HeadList &h,int position){

    if(position<1||position > h.n){

        return 0;

    }

    LNode *p=h.head;

    for(int j=1;j<=position-1;j++){

        p=p->next;

    }//p指向第i-1个位置

    LNode*q;

    q=h.head;

    for(int x=1;x<=position;x++){

        q=q->next;

    }//q指向第i个位置

    p->next=q->next;

    h.n--;

    return 1;

}

//撤销操作

void destory(HeadList &h){

    LNode *p;

    while (h.head)

    {

        p=h.head->next;

        free(h.head);

        h.head=p;

    }

  

}

  

int main(){

    HeadList h;

    init(h);

    insert(h,1,2);

    insert(h,2,4);

    insert(h,3,6);

    insert(h,4,8);

    insert(h,5,10);

    insert(h,6,12);

    insert(h,7,14);

    shanchu(h,7);

    // cout<<find(h,7)<<endl;

    output(h);

    destory(h);

    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值