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

来源:互联网 发布:程序员群头像 编辑:程序博客网 时间:2024/06/05 15:05
//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");
}
原创粉丝点击