6.C/C++数据结构
来源:互联网 发布:淘宝店保证金怎么交 编辑:程序博客网 时间:2024/06/14 14:31
1.单链表的各种操作
#include<iostream>using namespace std;//链表节点的定义typedef struct node{int data; //节点内容node *next;}node;//创建单链表node *create(){int i = 0; //链表中数据的个数node *head, *p, *q=NULL;int x = 0;head = (node*)malloc(sizeof(node)); //创建头节点while (1){cout << "Please input the data: " << endl;cin >> x;if (x == 0) //data=0时结束创建{break;}p = (node*)malloc(sizeof(node));p->data = x;if (++i==1){head->next = p;}else{q->next = p;}q = p; }q->next = NULL;return head;}void print(node*head){node* p;int index = 0;if (head->next==NULL){cout << "The Link is empty" << endl;return;}p = head->next;while (p!=NULL){cout << "The " << ++index << "th node is:" << p->data << endl;p = p->next;}}//单链表的测长int length(node* head){int len = 0;node* p;p = head->next;while (p!=NULL){len++;p = p->next;}return len;}//查找单链表pos位置上的节点node* search(node* head, int pos){node* p = head;if (pos < 0){cout << "error pos" << endl;return NULL;}if (pos == 0){return head;}if (head->next == NULL){cout << "the link is empty" << endl;return NULL;}for (int i = 1; i <= pos; i++){p = p->next;if (p == NULL){cout << "no pos search" << endl;break;}}return p;}//单链表的插入node *insert(node* head, int pos, int data){node* temp = NULL;node *p = NULL;temp = (node*)malloc(sizeof(node));temp->data = data;if (pos == 0){temp->next = head->next;head->next = temp;}p = search(head, pos);if (p != NULL){temp->next = p->next;p->next = temp;}return head;}//删除单链表的pos位置的节点,返回链表头指针node* delete_node(node* head, int pos){node *item = NULL;node *p = head->next;if (p == NULL){cout << "Link is empty " << endl;return NULL;}p = search(head, pos - 1);if (p != NULL && p->next != NULL){item = p->next;p->next = item->next;delete item;}return head;}//实现一个点链表的逆置node* reverse(node *head){ node *p, *q, *r;if (head->next == NULL){return head;}p = head->next;q = p->next;p->next = NULL;//r = NULL;while (q!=NULL){r = q->next;q->next = p;p = q; q=r;}head->next = p;return head;}//也可以用栈来实现转置node* rever1(node*head){ stack<node*> stack1; stack<node*> stack2; if (head->next == NULL) { return head; } node*p; node *q=NULL; p = head->next; while (p!=NULL) { stack1.push(p); p = p->next; } q = head->next; while (stack1.empty()!=NULL) { q = stack1.top(); stack1.pop(); q = q->next; } return head;}//寻找单链表的中间元素node *middle(node* head){int i = 0;int j = 0;node *current = NULL;node *middle = NULL;current = middle = head->next;while (current!=NULL){if (i / 2 > j){j++;middle = middle->next;}i++;current = current->next;}return middle;}//实现两个有序单链表的合并node* Merge(node* head1, node* head2){ node* head = NULL; if (head1 == NULL) { return head2; } if (head2 == NULL) { return head1; } if (head1->data < head2->data) { head = head1; head->next = Merge(head1->next, head2); } else { head = head2; head->next = Merge(head1, head2->next); } return head;}int main(){node *head = create();cout << "Ok" << endl;cout << "The link's length is: " << length(head) << endl;print(head);int pos = 0;cout << "input add the pos :" << endl;cin >> pos;int x = 0;cout << "input add data:" << endl;cin >> x;head = insert(head, pos, x);print(head);cout << "input the delete pos:" << endl;cin >> pos;head = delete_node(head, pos);print(head);cout << "reverse link:" << endl;head = reverse(head); print(head); cout << "the middle is: " << middle(head)->data << endl;return 0;}
Please input the data:
1
Please input the data:
2
Please input the data:
3
Please input the data:
0
Ok
The link's length is: 3
The 1th node is:1
The 2th node is:2
The 3th node is:3
input add the pos :
3
input add data:
4
The 1th node is:1
The 2th node is:2
The 3th node is:3
The 4th node is:4
input the delete pos:
4
The 1th node is:1
The 2th node is:2
The 3th node is:3
reverse link:
The 1th node is:3
The 2th node is:2
The 3th node is:1
the middle is: 2
2.双向链表的各种操作
//2.双向链表#include<iostream>using namespace std;//双向链表的定义typedef struct DbNode{int data; //节点数据DbNode* left; //前驱节点指针DbNode* right; //后继节点指针}DbNode;//创建链表函数DbNode *CreateList(int data){DbNode* pnode = (DbNode*)malloc(sizeof(DbNode));pnode->data = data;pnode->left = pnode->right = NULL; //前驱和后继指针都指向自身return pnode;}//插入新节点,总是在表尾插入,返回表头节点DbNode *AppendNode(DbNode *head, int data){DbNode *node = CreateList(data);DbNode *p = head, *q=NULL;while (p!=NULL){q = p;p = p->right;}q->right = node;node->left = q;return head;}//获取双向链表的长度int GetLength(DbNode* head){int count = 1;DbNode* pnode = NULL;if (head == NULL){return 0;}pnode = head->right;while (pnode!=NULL){pnode = pnode->right;count++;}return count;}//打印双向链表void PrintList(DbNode* head){DbNode* pnode = NULL;int i = 0;if (head == NULL){cout << "The link is empty" << endl;return;}pnode = head;while (pnode!=NULL){cout << "the " << ++i << "th is: " << pnode->data << endl;pnode = pnode->right;}}//双向链表节点的查找//找到数据为data的节点,如果找到节点,返回节点DbNode *FindNode(DbNode* head, int data){DbNode* pnode = head;if (head == NULL){return NULL;}while (pnode->right!=NULL && pnode->data!=data) //找到数据或者达到链表结尾的时候退出循环{pnode = pnode->right;}if (pnode->right == NULL) //还没找到data就已经到达链表结尾了{return NULL;}return pnode;}//双向链表的节点插入void InsertNode(DbNode*head, int pos, int data){DbNode *newnode = CreateList(data);DbNode *p = head;for (int i = 1; i <=pos; i++){p = p->right;if (p == NULL){cout << "the position is no" << endl;return;}}newnode->right = p->right;p->right = newnode;newnode->left = p;}//删除节点void DeleteNode(DbNode* head, int pos){DbNode *p;p = head;for (int i = 1; i <= pos; i++){p = p->right;if (p == NULL){cout << "the position is no" << endl;return;}}DbNode *ppre = p->left;DbNode *pafter = p->right;ppre->right = pafter;pafter->left = ppre;free(p);}int main(){DbNode *head = CreateList(0);for (int i = 1; i < 10; i++){head = AppendNode(head, i);}cout << "the length of link is: " << GetLength(head) << endl;PrintList(head);int pos, data=999;cout << "input the position of add: " << endl;cin >> pos;InsertNode(head, pos-1, data);PrintList(head);cout << "input the position of deltet:" << endl;cin >> pos;DeleteNode(head, pos-1);PrintList(head);return 0;}
the length of link is: 10
the 1th is: 0
the 2th is: 1
the 3th is: 2
the 4th is: 3
the 5th is: 4
the 6th is: 5
the 7th is: 6
the 8th is: 7
the 9th is: 8
the 10th is: 9
input the position of add:
9
the 1th is: 0
the 2th is: 1
the 3th is: 2
the 4th is: 3
the 5th is: 4
the 6th is: 5
the 7th is: 6
the 8th is: 7
the 9th is: 8
the 10th is: 999
the 11th is: 9
input the position of deltet:
2
the 1th is: 0
the 2th is: 2
the 3th is: 3
the 4th is: 4
the 5th is: 5
the 6th is: 6
the 7th is: 7
the 8th is: 8
the 9th is: 999
the 10th is: 9
3.队列的操作
//3.队列的操作#include<iostream>using namespace std;//队列中的每个节点的定义typedef struct node{int data;node * next; //指向链表的下一个指针}node;//定义队列typedef struct MyQuene{node* front; //队头node* rear; //队尾}MyQuene;//构造空的队列MyQuene *CreateMyQueue(){MyQuene *q = (MyQuene*)malloc(sizeof(MyQuene));q->front = NULL; //把队首指针置空q->rear = NULL; //把队尾指针置空return q;}//入队,从队尾一端插入节点MyQuene *enqueue(MyQuene* q, int data){node* newP = NULL;newP = (node*)malloc(sizeof(node)); //新建节点newP->data = data;newP->next = NULL;if (q->rear == NULL) //如果队列为空{ //如果队列为空,则新节点即是队首又是对尾q->front = q->rear = newP;}else{//如果队列不为空,则新建节点放到队尾,队尾指针指向新的节点q->rear->next = newP;q->rear = newP; //队尾进行更新}return q;}//出队,从队头删除节点MyQuene* dequeue(MyQuene *q){node *pnode = NULL;pnode = q->front;if (pnode == NULL){cout << "the queue is empyt" << endl;}else{q->front = q->front->next; //新队头if (q->front == NULL) //当删除后队列如果为空,对rear置空{q->rear = NULL;}free(pnode);}return q;}//队列的测长int GetLength(MyQuene *q){int nLen = 0;node* pnode = q->front; //指向队头if (pnode != NULL) //队列不为空{nLen = 1;}while (pnode!=q->rear) //遍历队列{pnode = pnode->next;nLen++;}return nLen;}void PrintMyQueue(MyQuene *q){int i = 0;node* pnode = q->front;if (pnode == NULL){cout << "Queue is empyt!" << endl;return;}while (pnode!=q->rear){cout << "the " << ++i << "th is: " << pnode->data << endl;pnode = pnode->next;}cout << "the " << ++i << "th is: " << q->rear->data << endl; //队尾节点数据}int main(){MyQuene *hp = CreateMyQueue();enqueue(hp, 1);enqueue(hp, 2);enqueue(hp, 3);enqueue(hp, 4);PrintMyQueue(hp);cout << "the length of que is:" << GetLength(hp) << endl;cout << "out of data after:" << endl;hp = dequeue(hp);PrintMyQueue(hp);cout << "the length of que is:" << GetLength(hp) << endl;return 0;}
the 1th is: 1
the 2th is: 2
the 3th is: 3
the 4th is: 4
the length of que is:4
out of data after:
the 1th is: 2
the 2th is: 3
the 3th is: 4
the length of que is:3
4.队列和栈有什么区别
队列和栈是两种不同的数据结构。它们有以下区别
(1)操作的名称不同。队列的插入称为入队,队列的删除称为出对。栈的插入称为进栈,栈的删除称为出栈。
(2)可操作的方向不同。队列是在对尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
(3)操作的方法不同。对列是先进先出(FIFO),即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(不能中间插入),每次离开的成员总是队列头上的(不允许中途离队)。而栈是后进先出(LIFO),即每次删除(出栈)的总是当前栈中“最新的”元素,即最后插入(进栈)的元素,而最先插入的被放在栈的底部,要到最后才能删除。
5.栈的操作
//5.栈的操作#include<iostream>using namespace std;class MyData //节点类{public:MyData():data(0),next(NULL){}MyData(int value):data(value),next(NULL){}int data;MyData *next;};class MyStack //栈类{public:MyStack():top(NULL){}void push(int data); //进栈void pop(); //出栈bool IsEmpty(); //判断是否为空栈MyData *top;};//进栈void MyStack::push(int data){MyData *pData = NULL;pData = new MyData(data);pData->next = top;top = pData;}//出栈void MyStack::pop(){MyData *pData = NULL;if (IsEmpty()){return;}pData = top->next;cout << "the pop :" << top->data << endl;top = pData;}//判断是否为空栈bool MyStack::IsEmpty(){return (top == NULL);}int main(){MyStack s;s.push(1);s.push(2);s.push(3);s.pop();s.pop();cout << "Empty = " << s.IsEmpty() << endl;return 0;}
the pop :3
the pop :2
Empty = 0
- 6.C/C++数据结构
- C++,数据结构
- 数据结构C
- 数据结构(C)
- 数据结构(C#)--单链表
- 数据结构(C#)--单链表
- 插入排序 --C数据结构
- 冒泡排序 C数据结构
- 基数排序 C语言数据结构
- 数据结构(C++)--二叉树
- 链式队列(数据结构C#)
- C数据结构 栈
- 2010c数据结构日志
- 数据结构---堆栈(C#)
- 数据结构---队列(C#)
- c 数据结构 单链表
- 二叉树(数据结构 c++)
- 数据结构(C#)-排序
- Vue-cli 脚手架搭建 Vue 项目
- 解决问题的流程
- java基础个人总结2
- shell字符串操作
- [Leetcode] 169. Majority Element 解题报告
- 6.C/C++数据结构
- [LeetCode] Integer Break
- Python廖雪峰实战web开发(Day2-编写Web APP骨架)
- 【要不是...】
- radius
- freemarker自定义指令
- 跟随老罗的博客,试验Android
- 雨滴,美丽的雨滴
- windows server 2012安装ftp服务