【数据结构】双向链表

双向链表

双链表
在双向链表中头节点包含两个指针域(first和tail)。
first指向第一个结点,tail指向最后一个结点
每个结点包含两个指针域和一个数据域,数据域用来保存数据。
两个指针域分别为front和next,front指向当前结点的前驱,next指向当前结点的后继。
第一个结点没有前驱,最后一个结点没有后继

双向链表的基本操作

1.结构

//双向链表结构 
struct node{
    struct node *front;
    int data;
    struct node *next;
};

//头节点结构
struct headNode{
    struct node *first;
    struct node *tail;
};

2.初始化

struct headNode * initHeadNode(){
    struct headNode *h = (struct headNode *)malloc(sizeof(struct headNode));
    h->first = NULL;
    h->tail = NULL;
    return h;
} 

3.输入数据

//输入数据
void inputData(struct headNode *h){
    int data;
    struct node *p;
    while(1){
        printf("Please input data : ");
        scanf("%d",&data);
        if(data == 0){
            break;
        }
        if(h->first == h->tail && h->first == NULL && h->tail == NULL){
            p = (struct node *)malloc(sizeof(struct node));
            p->data = data;
            p->front = NULL;
            p->next = NULL;
            h->first = p;
            h->tail = p;
        }else{
            p = (struct node *)malloc(sizeof(struct node));
            p->data = data;
            p->front = h->tail;
            p->next = NULL;
            h->tail->next = p;
            h->tail = p;
        }
    }

} 

4.输出数据

//输出数据
void outputData(struct headNode *h){
    struct node *p;
    p = h->first;
    while(p){
        printf(" %d ",p->data);
        p = p->next;
    }
    printf("\n");
}

//反向输出数据
void adverseOutputData(struct headNode *h){
    struct node *p;
    p = h->tail;
    while(p){
        printf(" %d ",p->data);
        p = p->front;
    }
    printf("\n");
} 

5.求长度

//求长度
int length(struct headNode *h){
    struct node *p;
    p = h->first;
    int length = 0;
    while(p){
        p = p->next;
        length++;
    }
    return length;
} 

6.插入数据

void insertData(struct headNode *h,int loc,int data){
    struct node *p;
    p = h->first;
    int i = 1;
    //根据位置找到节点 
    while(i<loc){
        p = p->next;
        i++;
    }
    //开始插入
    struct node *newNode = (struct node *)malloc(sizeof(struct node));  
    newNode->data = data;
    newNode->front = p;
    newNode->next = p->next;
    p->next->front = newNode;
    p->next = newNode;
} 

7.删除数据

void delData(struct headNode *h,int loc){
    struct node *p = h->first;
    int i = 0;
    while(i<loc){
        p = p->next;
        i++;
    }
    //开始删除
    struct node *delData = p;
    p->front->next = p->next;
    p->next->front = p->front;
    free(p);
} 

8.main函数调用测试

int main(){
    struct headNode *h = initHeadNode();
    if(h){
        printf("--->>>Init Success!!!\n");
        inputData(h);
        outputData(h);
        adverseOutputData(h);
        printf("insert alter:");
        insertData(h,2,66);
        outputData(h);
        printf("length : %d\n",length(h));
        printf("delete alter");
        delData(h,2);
        outputData(h);
        printf("length : %d\n",length(h));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值