循环链表&线性表(5.15)
来源:互联网 发布:淘宝免单网 编辑:程序博客网 时间:2024/06/03 17:40
练习:
创建一个n个节点环形链表(不包含头节点),然后输出这个环形链表
例如:
LinkNode *create_loop_linklist(int n){当n为10的时候,这个环形链表中有:1,2,3,4,5,6,7,8,9,10 返回第一个数据节点的地址}int printf_loop_linklist(LinkNode *p){}代码如下:
#include <stdio.h>#include <stdlib.h>typedef int DATATYPE;typedef struct node {DATATYPE data;struct node *next;}LinkNode;LinkNode *create_loop_linklist(int n){int i;LinkNode *p;LinkNode *temp;LinkNode *head;head = (LinkNode *)malloc(sizeof(LinkNode));head->data = 1;for(p = head,i = 2;i <= n;i ++){temp = (LinkNode *)malloc(sizeof(LinkNode));temp->data = i;p->next = temp;p = p->next;//p = temp 让走到新节点的位置}p->next = head;return head;}int printf_loop_linklist(LinkNode *head){LinkNode *p;for(p = head;p->next != head;p = p->next){printf("%d ",p->data);}printf("%d\n",p->data);return 0;}int main(int argc, const char *argv[]){LinkNode *L = create_loop_linklist(10);printf_loop_linklist(L);return 0;}
一 线性表 -------------------- 栈
这里的栈本质是一种线性表,但是它规定数据先进后出,也就是说一种线性表只要它遵从"先进后出"的原则,就可以
认为它是栈。
一般的使用原则:先保存一些数据,到后面的时候才使用它,例如:界面的切换,表达式的计算...
1 + 3 * 5 + 6
思考:已知出栈的顺序是1,2,3,4,问进栈顺序可能是什么
4,2,3,1
...
1.顺序栈
typedef struct {DATATYPE buf[MAX];//栈空间int top;//记录栈顶元素的位置}SeqStack;SeqStack *create_stack(){SeqStack *s;s = malloc();s->top = 0;return s;}int is_empty_stack(SeqStack *s){return s->top == 0 ? 1 : 0;}int is_full_stack(SeqStack *s){return s->top == MAX ? 1 : 0;}int push_stack(SeqStack *s,DATATYPE data){...}//将出栈元素返回DATATYPE pop_stack(SeqStack *s){...}DATATYPE get_top_data(SeqStack *s){....}int main(){int i = 1;SeqStack *s = create_stack();while(!is_full_stack(s)){push_stack(s,i ++);}while(!is_empty_stack(s)){printf("%d ",pop_stack(s));}printf("\n");return 0;}
代码如下:
#include <stdio.h>#include <stdlib.h>typedef int DATATYPE;#define MAX 10typedef struct {DATATYPE buf[MAX];int top;}SeqStack;SeqStack *create_empty_stack(){SeqStack *s;s = (SeqStack *)malloc(sizeof(SeqStack));s->top = 0;return s;}int is_empty_stack(SeqStack *s){return s->top == 0 ? 1 : 0;}int is_full_stack(SeqStack *s){return s->top == MAX ? 1 : 0;}int push_stack(SeqStack *s,DATATYPE data){if(is_full_stack(s)){printf("The stack is full!\n");return -1;}s->buf[s->top ++] = data;return 0;}DATATYPE pop_stack(SeqStack *s){if(is_empty_stack(s)){printf("The stack is empty!\n");return -1;}return s->buf[--s->top];}DATATYPE get_top_stack(SeqStack *s){return s->buf[s->top - 1];}int main(int argc, const char *argv[]){int i = 1;SeqStack * s = create_empty_stack();while(!is_full_stack(s)){push_stack(s,i ++);}printf("top data : %d\n",get_top_stack(s));while(!is_empty_stack(s)){printf("%d ",pop_stack(s));}printf("\n");return 0;}
2.链式栈 = 栈头 + 无头的链表
(1)栈中数据节点类型
typedef struct node {DATATYPE data;struct node *next;}LinkNode;
(2)栈头的类型
typedef struct {LinkNode *top;//记录栈顶元素节点的地址int n;//记录栈中元素的个数}LinkStack;
(3)创建一个空栈
LinkStack *create_empty_linkstack(){LinkStack *s;s = (LinkStack *)malloc(sizeof(LinkStack));s->top = NULL;s->n = 0;return s;}
(4)进栈
int push_linkstack(LinkStack *s,DATATYPE data){...}
(5)出栈
DATATYPE pop_stack(LinkStack *s){...}
(6)判断栈是否为空
int is_empty_linkstack(LinkStack *s){return s->top == NULL ? 1 : 0;}代码如下:
#include <stdio.h>#include <stdlib.h>typedef int DATATYPE;//栈中数据节点类型typedef struct node {DATATYPE data;struct node *next;}LinkNode;//栈头类型typedef struct {LinkNode *top;//记录栈顶元素节点的地址int n;//栈中数据的个数}LinkStack;LinkStack *create_empty_linkstack(){LinkStack *s;s = (LinkStack *)malloc(sizeof(LinkStack));s->top = NULL;s->n = 0;return s;}int is_empty_linkstack(LinkStack *s){return s->top == NULL ? 1 : 0;}int push_linkstack(LinkStack *s,DATATYPE data){LinkNode *temp;temp = (LinkNode *)malloc(sizeof(LinkNode));temp->data = data;//用新节点保存栈顶的地址temp->next = s->top;//用s->top记录新栈顶的地址s->top = temp;//更新n的值s->n ++;return 0;}DATATYPE pop_linkstack(LinkStack *s){DATATYPE data;LinkNode *temp;//获得栈顶元素的地址temp = s->top;//让s->top保存栈顶元素的下一个节点地址s->top = temp->next;//获得栈顶的值data = temp->data;//释放栈栈顶的节点free(temp);//更新n s->n --;return data;}DATATYPE get_top_linkstack(LinkStack *s){return s->top->data;}int main(int argc, const char *argv[]){int i = 0;LinkStack *s = create_empty_linkstack();for(i = 1;i <= 10;i ++){push_linkstack(s,i);}printf("Top data : %d\n",get_top_linkstack(s));while(!is_empty_linkstack(s)){printf("%d ",pop_linkstack(s));}printf("\n");return 0;}
0 0
- 循环链表&线性表(5.15)
- 线性循环链表
- 线性表的实现(三)循环链表
- 数据结构(9)线性表之循环链表介绍
- 实验二 线性表综合实验(循环链表)
- 线性表综合实验(循环链表)
- 数据结构 线性表 建立循环链表
- 线性表之循环链表
- 线性表-链式实现-循环链表
- 线性表之双向循环链表
- 线性表---双向循环链表
- 【线性表】双向循环链表
- 线性表之循环链表
- 数据结构之线性结构(循环链表)【三】
- 带头结点双链循环线性表
- 数据结构(严蔚敏)------双链循环线性表
- 线性表 - 双链表(非循环)
- 线性表-顺序队列(循环队列)
- 《Java程序设计》第二次作业:MySQL数据库及Java操作MySQL数据库
- 黑马程序员(八)网络编程
- 欢迎使用CSDN-markdown编辑器
- ACM练习—谁获得了最高奖学金
- MFC对话框风格和工程字符集的关系
- 循环链表&线性表(5.15)
- C语言学习第三天—控制流
- 网页中调起本地程序系列——简介篇
- android中Activity切换动画学习心得
- 论战Yann LeCun:谁能解释极限学习机(ELM)牛X在哪里?
- CWnd常用函数讲解
- C 语言学习第四天—函数和文件组织
- 思维拓展-记孩子疫苗接种登记
- C语言学习第五天—递归