C语言强化——链表(2)
目录
链表的应用:
- 栈
- 循环队列
- C语言实现动态数组
- 数组实现定长元素个数层次建树
- 队列实现不定元素个数层次建树 (*)
栈
栈(链表应用)
"stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tag{
int m_ival;
struct tag *next;
}Node,*pNode;
typedef struct{
pNode phead;//栈顶指针
int size;
}Stack,*pStack;
void initStack(pStack);
void pop(pStack);
void push(pStack,int);
int top(pStack);
int empty(pStack);
int size(pStack);
"stack.c"
#include "stack.h"
void initStack(pStack p)
{
memset(p,0,sizeof(Stack));
}
void pop(pStack p)
{
if(!p->size)
{
printf("stack is empty\n");
return;
}
p->phead=p->phead->next;
p->size--;
}
void push(pStack p,int val)
{
pNode pNew=(pNode)calloc(1,sizeof(Node));
pNew->m_ival=val;
if(NULL==p->phead)
{
p->phead=pNew;
}else{
pNew->next=p->phead;//新结点的next指向原有头结点
p->phead=pNew;
}
p->size++;
}
int top(pStack p)
{
return p->phead->m_ival;
}
int empty(pStack p)
{
return !p->size;
}
int size(pStack p)
{
return p->size;
}
"main.c"
#include "stack.h"
int main() {
Stack s;
initStack(&s);
push(&s, 5);
push(&s, 10);
printf("Stack size is %d\n", size(&s));
printf("Stack top val is %d\n", top(&s));
pop(&s);
printf("Stack top val is %d\n", top(&s));
pop(&s);
pop(&s);
return 0;
}
循环队列
queue.h
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 5
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue*);
int EnQueue(SqQueue*,ElemType);
int DeQueue(SqQueue*,ElemType*);
queue.c
#include "queue.h"
void InitQueue(SqQueue* pq)
{
pq->front=pq->rear=0;
}
int EnQueue(SqQueue* pq,ElemType val)
{
if((pq->rear+1)%MaxSize==pq->front)
{
printf("queue is full\n");
return 0;
}
pq->data[pq->rear]=val;
pq->rear=(pq->rear+1)%MaxSize;
return 1;
}
int DeQueue(SqQueue* pq,ElemType* x)
{
if(pq->rear==pq->front)
{
printf("queue is empty\n");
return 0;
}
*x=pq->data[pq->front];
pq->front=(pq->front+1)%MaxSize;
return 1;
}
main.c
#include "queue.h"
int main()
{
SqQueue q;
ElemType val;
InitQueue(&q);
EnQueue(&q,10);
EnQueue(&q,7);
EnQueue(&q,5);
EnQueue(&q,3);
EnQueue(&q,9);
DeQueue(&q,&val);
system("pause");
}
C语言实现动态数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char *p;
int size;//当前放了多少数据
int capacity;//容量大小,申请了多少空间
}DynArr;
#define N 10
int main()
{
DynArr d;
int i=0;
d.size=0;
d.capacity=N;
d.p=(char*)malloc(d.capacity);
while(scanf("%c",d.p+d.size)!=EOF)
{
d.size++;
if(d.size==d.capacity)
{
d.capacity=d.capacity*2;
d.p=(char*)realloc(d.p,d.capacity);
}
}
d.p[d.size-1]='\0';
printf("%s\n",d.p);
system("pause");
}
队列实现不定元素个数层次建树 (*)
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node{
ElemType c;
struct node *pleft;
struct node *prgiht;
}Node,*pNode;
typedef struct que{
pNode p;
struct que *pNext;
}Que_t,*pQue_t;
//前序遍历
void preOrder(pNode p)
{
if(p)
{
putchar(p->c);
preOrder(p->pleft);
preOrder(p->prgiht);
}
}
int main()
{
ElemType c;
pQue_t queHead=NULL,queTail=NULL,queNew,queFree;
pNode treeRoot=NULL,treeNew;
while(scanf("%c",&c)!=EOF)
{
if(c=='\n')
{
break;
}
treeNew=(pNode)calloc(1,sizeof(Node));//给树的新结点申请空间
treeNew->c=c;
queNew=(pQue_t)calloc(1,sizeof(Que_t));//给队列的新结点申请空间
queNew->p=treeNew;
if(!treeRoot)
{
treeRoot=treeNew;//第一个结点作为树根
queHead=queTail=queNew;//第一个结点作为队列头
}else{
if(NULL==queHead->p->pleft)
{
queHead->p->pleft=treeNew;
}else if(NULL==queHead->p->prgiht)
{
queHead->p->prgiht=treeNew;
//头部删除法
queFree=queHead;
queHead=queHead->pNext;
free(queFree);
}
//尾插法
queTail->pNext=queNew;
queTail=queNew;
}
}
preOrder(treeRoot);
printf("\n");
system("pause");
}
数组实现定长元素个数层次建树
#include<stdio.h>
#define N 10
typedef char ElemType;
typedef struct node {
ElemType c;
struct node *pleft;
struct node *pright;
}Node, *pNode;
void preOrder(pNode p)
{
if (p)
{
putchar(p->c);
preOrder(p->pleft);
preOrder(p->pright);
}
}
int main() {
ElemType c[N + 1] = "ABCDEFGHIJ";
int i, j;
pNode p[N]; //结构体指针数组
pNode root;
for (i = 0;i < N;++i) {
p[i] = (pNode)calloc(1, sizeof(Node));
p[i]->c = c[i];
}
root = p[0];
j = 0;
for (i = 1;i < N;++i) {
if (NULL == p[j]->pleft) {
p[j]->pleft = p[i];
}
else if (NULL == p[j]->pright) {
p[j]->pright = p[i];
j++;
}
}
preOrder(root);
return 0;
}
C语言强化——链表(2)的更多相关文章
- C语言强化——链表(1)
目录 链表的增删(不带头结点) 链表相关面试题 合并两个有序链表 单链表原地逆置 找出链表的倒数第四个节点 找出链表的中间节点 判断单链表是否有环 求链表交点 删除有序单链表中重复的元素 链表按奇数. ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
- YTU 2430: C语言习题 链表建立,插入,删除,输出
2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 576 解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...
- 关于c语言单项链表尾添加
犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- C语言:链表实现的一个实例
问题:写一个程序输入你一年看过的所有电影以及每部电影的各种信息(简化问题:每部电影只要求输入片名和评价) 链表实现: #include<stdio.h> #include<stdli ...
- C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
- (转)c语言_链表实例讲解(两个经典例子)
建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade { ...
随机推荐
- 简单的Windows应用程序命名规则
读书:<高质量C++编程指南> 作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发. l [规则3-2-1]类名和函数名用大写字母开头的 ...
- eventEmitter
wade-mac:fin_server_invest mac$ node > var events =require('events') undefined > var eventEmit ...
- Python知识点整理,基础2 - 列表操作
- Django之JsonResponse
JsonResponse 对象: class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=No ...
- 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)
- mysql再探
select子句及其顺序 select from where group by having order by limit 创建表 create table student(id int not nu ...
- ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3
老师信息管理 三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边: s ...
- nuxt docker 运行
nuxt 是vue 版的next ,实现的功能还是很方便的,对于需要开发性能要求比较高的web app 是一个很不错的选择 备注: 项目很简单,使用docker && docker-c ...
- 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解)
不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...
- FastAdmin Git 开发更新流程
更加简洁的流程 FastAdmin 使用 Git 更新的新用法 https://www.cnblogs.com/F4NNIU/p/9120365.html