基礎資料結構 鏈表、棧、隊列

來源:互聯網
上載者:User

標籤:資料結構   演算法導論   鏈表   棧   隊列   

資料結構是程式設計中一個非常重要的部分,基本的資料結構包括鏈表、棧和隊列,當然進階一點的還有樹、圖等,實際上鏈表、棧和隊列都是線性表,只是在操作和表示方式上有所不同,線性表用順序結構表示就是順序表,用鏈結構表示就是鏈表,如果對線性表的操作加以限制,只能有在表尾進行插入和刪除元素,這就變成棧了,如果只能允許元素從表尾插入,表頭刪除,這就變成隊列了。


鏈表

/* *資料結構 鏈表 *鏈式結構 */#include <iostream>using namespace std;enum Status {ERROR = -1,OK = 0};typedef int ElemType;//定義鏈表的節點typedef struct LNode {ElemType data;LNode *next;} LNode, *LinkList;/* *建立一個長度為size的單鏈表,並返回鏈表頭結點 *從後先前不斷插入新的元素,每次新元素都添加到頭結點後面 */LinkList createList(int size){if (size <= 0)return NULL;//定義前端節點LinkList list = new LNode[1];list->next = NULL;for (int i=size; i>=1; i--){LNode *node = new LNode[1];cin>>node->data;node->next = list->next;list->next = node;}return list;}/* *從鏈表 list 中取第 pos 個元素,並將元素值付給 elem */Status getElem(LinkList list, int pos, ElemType &elem){if (! list){return Status::ERROR;}LNode *p = list->next;int j = 1;while (p && j<pos){p = p->next;j++;}//判斷是否存在第 pos 個元素,或者 pos 值輸入不合法(負值或0)if (! p || j > pos){return Status::ERROR;}elem = p->data;return Status::OK;}/* *將元素elem插入到鏈表list中的第pos個位置 *要想在第pos個位置插入元素,需要先找到第 *pos-1個位置 */Status insertList(LinkList list, int pos, ElemType elem){LNode *p = list;int j = 0;while (p && j<pos-1){p = p->next;j++;}if (! p || j > pos-1){return Status::ERROR;}LNode *node = new LNode[1];node->data = elem;node->next = p->next;p->next = node;return Status::OK;}/* *從鏈表list中刪除第pos個元素,並將該元素值賦給elem *首先找到第pos-1個元素 */Status deleteList(LinkList list, int pos, ElemType &elem){LNode *p = list;int j = 0;//找到第 pos-1 個元素while (p && j<pos-1){p = p->next;j++;}if (! p || j>pos-1 || ! p->next){return Status::ERROR;}LNode *q = p->next;elem = q->data;p->next = q->next;delete q;return Status::OK;}/* *合并鏈表list1和list2,並返回合并後的鏈表頭結點 *list1和list2均是按值非遞減排列 */LinkList mergeList(LinkList list1, LinkList list2){LinkList list;if (! list1 || ! list2){list = list2==NULL ? list1 : list2;return list;}list = list1;LinkList p = list, p1 = list1->next, p2 = list2->next;while (p1 && p2){if (p1->data <= p2->data){p->next = p1;p1 = p1->next;} else {p->next = p2;p2 = p2->next;}p = p->next;}p->next = p1 ? p1 : p2;delete list2;return list;}void printList(LinkList list, char *str=""){cout<<str<<endl;if (list == NULL)return;LNode *p = list->next;while (p){cout<<p->data<<" ";p = p->next;}cout<<endl;}void destroyList(LinkList list){if (! list){return;}while (list->next){LNode *p = list->next;list->next = p->next;delete p;}delete list;}

棧

/* *資料結構 棧 *順序結構 */#include <iostream>#include <cstdlib>using namespace std;#define STACK_INIT_SIZE 100#define STACK_INCREMENT 10enum Status{ERROR = -1,OK = 0,TRUE = 1,FALSE = 2};typedef int ElemType;typedef struct Stack {ElemType *top;//指向棧頂元素的上一個位置ElemType *base;//指向棧底元素int size;//棧空間的長度} Stack;/* *初始化棧操作 */Status initStack(Stack* &stack){//此處的形參必須使用指標的引用,因為可能會改變指標本身的值,而不是其指向的對象的值if (! stack){stack = (Stack*)malloc(sizeof(Stack));}stack->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));if (! stack->base){return Status::ERROR;}stack->top = stack->base;stack->size = STACK_INIT_SIZE;return Status::OK;}/* *擷取棧頂元素 */Status getTop(Stack *stack, ElemType &elem){if (! stack || stack->base == stack->top){return Status::ERROR;}elem = *(stack->top-1);return Status::OK;}/* * 壓入新的元素到棧頂 */Status push(Stack *stack, ElemType elem){if (! stack) {return Status::ERROR;}//先判斷棧是否滿if (stack->top - stack->base >= stack->size){stack->base = (ElemType*)realloc(stack->base, (stack->size+STACK_INCREMENT)*sizeof(ElemType));if (! stack->base){return Status::ERROR;}stack->top = stack->base + stack->size;stack->size += STACK_INCREMENT;}*stack->top = elem;stack->top++;return Status::OK;}/* *判斷棧是否為空白 */Status isEmpty(Stack *stack){if (! stack || stack->base == stack->top){return Status::TRUE;}return Status::FALSE;}/* *彈出棧頂元素 */Status pop(Stack* stack, ElemType &elem){if (isEmpty(stack) == Status::TRUE){return Status::ERROR;}stack->top--;elem = *stack->top;return Status::OK;}Status destroyStack(Stack *stack){if (! stack)return Status::OK;if (stack->base){free(stack->base);stack->base = stack->top = NULL;}return Status::OK;}void printStack(Stack *stack, char *str = ""){if (isEmpty(stack) == Status::TRUE){return;}cout<<str<<endl;ElemType *p = stack->base;while (p != stack->top){cout<<*p<<" ";p++;}cout<<endl;}

隊列

/* *資料結構 隊列 *鏈式結構 */#include <iostream>using namespace std;enum Status {ERROR = -1,OK = 0,TRUE = 1,FALSE = 2};typedef int ElemType;typedef struct QNode {ElemType data;QNode* next;} QNode;typedef struct LinkQueue{QNode* front;QNode* rear;} LinkQueue;/* *初始化隊列 */Status initQueue(LinkQueue* &queue){if (! queue){queue = (LinkQueue*)malloc(sizeof(LinkQueue));}queue->front = queue->rear = (QNode*)malloc(sizeof(QNode));if (! queue->front){return Status::ERROR;}queue->front->next = NULL;return Status::OK;}/* *入隊 */Status enQueue(LinkQueue* queue, ElemType elem){if (! queue){return Status::ERROR;}QNode* node = (QNode*)malloc(sizeof(QNode));if (! node){return Status::ERROR;}node->data = elem;node->next = NULL;queue->rear->next = node;queue->rear = node;return Status::OK;}/* *判斷隊列是否為空白 */Status isEmpty(LinkQueue* queue){if (! queue || queue->front == queue->rear)return Status::TRUE;return Status::FALSE;}/* *出隊 */Status deQueue(LinkQueue* queue, ElemType &elem){if (isEmpty(queue) == Status::TRUE){return Status::ERROR;}QNode* p = queue->front->next;elem = p->data;queue->front->next = p->next;if (queue->rear == p)queue->rear = queue->front;free(p);return Status::OK;}/* *銷毀隊列 */Status destroyQueue(LinkQueue* queue){if (! queue)return Status::OK;while (queue->front){queue->rear = queue->front->next;free(queue->front);queue->front = queue->rear;}return Status::OK;}void printQueue(LinkQueue* queue, char* str){if (isEmpty(queue) == Status::TRUE){return;}cout<<str<<endl;QNode* p = queue->front->next;while (p){cout<<p->data<<" ";p = p->next;}cout<<endl;}

/* *資料結構 隊列  *順序結構,迴圈隊列 *因為隊列是從隊頭刪除元素,從隊尾插入元素 *在刪除元素之後,不可能讓隊列中的所有元素都向前移動 *只能是將隊頭指標向後收縮一個位置,則前面空出了空間,為了使用這些空間 *就需要使用迴圈隊列,將隊頭和隊尾串連起來,這樣真正的隊頭並不一定就是申請 *到的順序空間的首地址,隊尾也並不一定就是順序空間的尾地址,所以在迴圈隊列滿了之後 *無法使用realloc重新分配新的空間使用,因為這樣會打破原來的隊列結構,新的隊列空間可能 *會插入到隊列的任意位置,對隊列的頭尾操作同樣無法進行,所以只能給迴圈隊列設定一個最大 *隊列長度,無法動態分配,如果最大長度不確定,則使用鏈式隊列較好 */#include <iostream>using namespace std;#define MAXSIZE 100enum Status{ERROR = -1,OK = 0,TRUE = 1,FALSE = 2};typedef int ElemType;typedef struct CircleQueue{ElemType* base;int front;int rear;} CircleQueue;/* *初始化隊列 */Status initQueue(CircleQueue* &queue){if (! queue){queue = (CircleQueue*)malloc(sizeof(CircleQueue));}if (! queue)return Status::ERROR;queue->base = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));if (! queue->base){return Status::ERROR;}queue->front = queue->rear = 0;return Status::OK;}/* *擷取隊列的長度 */int getLength(CircleQueue* queue){if (! queue){return 0;}return (queue->rear - queue->front + MAXSIZE) % MAXSIZE;}/* *入隊 */Status enQueue(CircleQueue* queue, ElemType elem){//預留一個空間不放元素,以區別隊列滿和空的標誌if (! queue || (queue->rear+1)%MAXSIZE == queue->front){return Status::ERROR;}queue->base[queue->rear] = elem;queue->rear = (queue->rear + 1) % MAXSIZE;return Status::OK;}/* *判斷隊列是否為空白 */Status isEmpty(CircleQueue* queue){if (! queue || ! queue->base || queue->front == queue->rear){return Status::TRUE;}return Status::FALSE;}/* *出隊 */Status deQueue(CircleQueue* queue, ElemType &elem){if (isEmpty(queue) == Status::TRUE){return Status::ERROR;}elem = queue->base[queue->front];queue->front = (queue->front + 1) % MAXSIZE;return Status::OK;}/* *銷毀隊列 */Status destroyQueue(CircleQueue* queue){if (! queue){return Status::OK;}if (queue->base){free(queue->base);queue->base = NULL;}return Status::OK;}void printQueue(CircleQueue* queue, char* str){if (isEmpty(queue) == Status::TRUE)return;cout<<str<<endl;int pos = queue->front;while (pos != queue->rear){cout<<queue->base[pos]<<" ";pos = (pos+1)%MAXSIZE;}cout<<endl;}



基礎資料結構 鏈表、棧、隊列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.