您的位置:首页 > 理论基础 > 数据结构算法

C语言 数据结构 队列 链队列

2017-06-07 19:39 120 查看
//C语言--数据结构--队列 链队列

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

#include <malloc.h>

#include <windows.h>

using namespace std;

typedef struct node{

    char *data;        //数据存储区

    struct node *next; //存放下一节点的地址

}LinkQueue,*Link;

typedef struct{

    Link   front;   //队头指针

    Link   rear;    //队尾指针

}linkqueue;

int  init(linkqueue *link);

int  append(linkqueue *link,char *data);

int  insert(linkqueue *link,int index,char *data);

int  modify(linkqueue *link,int index,char *data);

int  remove(linkqueue *link,int index);

Link  get(linkqueue *link,int index);

int  getLength(linkqueue *link);

void getAll(linkqueue *link);

int  isExist(linkqueue *link);

int  isEmpty(linkqueue *link);

int  distory(linkqueue *link);

//初始化链队列

int init(linkqueue *link){

    link->front=link->rear=(LinkQueue *)malloc(sizeof(LinkQueue));//

    if (link->front==NULL){

        cout<< "初始化链队列失败!!!" <<endl;

        return 0;

    }

    link->front->next=NULL;

    return 1;

}

//在链队列的最后追加元素

int append(linkqueue *link,char *data){

    LinkQueue *container=(LinkQueue *)malloc(sizeof(LinkQueue));

    if (container==NULL){

        printf("数据元素添加失败!!!\n");

        return 0;

    }

    container->data=data;

    container->next=0;

    link->rear->next=container;

    link->rear=container;

    return 1;

}

//在链队列的第index位置插入元素

int insert(linkqueue *link,int index,char *data){

    if(index<0 || index>getLength(link)){

        printf("索引下标越界!!!\n");

        return 0;

    }

    LinkQueue *container=(LinkQueue *)malloc(sizeof(LinkQueue));

    container->data=data;

    LinkQueue *first=link->front->next;

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

        first=first->next;

    }

    container->next=first->next;

    first->next=container;

    return 1;

}

//更改链队列的第index位置的元素

int modify(linkqueue *link,int index,char *data){

    if (index<0||index>getLength(link)){

        printf("索引下标越界!!!\n");

        return 0;

    }

    LinkQueue *modify=link->front->next;

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

        modify=modify->next;

    }

    modify->data=data;

    return 1;

}

//移除链队列的第index位置的元素

int remove(linkqueue *link,int index){

    if (index<0||index>getLength(link)){

        printf("索引下标越界!!!\n");

        return 0;

    }

    if (index==getLength(link)){

        LinkQueue *last=link->front;

        for (int i=0;i<index-1;i++){

            last=last->next;

        }

        last->next=NULL;

        return 1;

    }

    LinkQueue *move=link->front;

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

        move=move->next;

    }

    move->next=move->next->next;

    return 1;

}

//获取链队列的第index位置的元素

Link get(linkqueue *link,int index){

    if (index<0||index>getLength(link)){

        printf("索引下标越界!!!\n");

        return NULL;

    }

    LinkQueue *get=link->front->next;

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

        get=get->next;

    }

    return get;

}

//获取链队列的有效长度

int getLength(linkqueue *link){

    LinkQueue *len=link->front->next;

    int length=0;

    while(len){

        length++;

        len=len->next;

    }

    return length;

}

//输出链队列的全部元素

void getAll(linkqueue *link){

    LinkQueue *show=link->front->next;

    while(show){

        printf("%s\n",show->data);

        show=show->next;

    }

}

//判断链队列是否存在

int isExist(linkqueue *link){

    if (link->front==NULL || link->rear==NULL){

        cout<<"链队列未初始化!!!"<<endl;

        return 0;

    }else{

        return 1;

    }

}

//判断链队列是否为空

int isEmpty(linkqueue *link){

    if (isExist(link)){

        if(link->front==link->rear){

            return 1;

        }else{

            return 0;

        }

    }

    return 0;

}

//销毁链队列

int distory(linkqueue *link){

    free(link);

    return 1;

}

void main(){

    linkqueue link;

    init(&link);

    append(&link,"a");

    append(&link,"b");

    append(&link,"c");

    append(&link,"d");

    append(&link,"e");

    //modify(&link,4,"H");

    int k=4;

    cout<<"获取的第 "<<k<<" 个元素为 "<<get(&link,k)->data<<endl;

    //remove(&link,5);

    insert(&link,2,"X");

    getAll(&link);

    cout<<"链队列长度 "<<getLength(&link)<<endl;

    system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息