一些可运行的C语言数据结构代码

网上有很多C语言数据结构代码;有的不能运行;下面是一些能运行的,和运行截图;备用一下;

1 队列

#include<stdio.h>
#include<stdlib.h>

#define QUEUE_SIZE 50  

typedef struct SeqQueue
{
    int data[QUEUE_SIZE];
    int front;
    int rear;  

}Queue;  

Queue *InitQueue()
{
    Queue *q = (Queue *)malloc(sizeof(Queue));
    if(q == NULL)
    {
        printf("Malloc failed!\n");
        exit(-1);
    }
    q->front = 0;
    q->rear = 0;  

    return q;
}  

int IsFull(Queue *q)
{
    return ((q->rear+1)%QUEUE_SIZE == q->front);
}  

int IsEmpty(Queue *q)
{
    return (q->front == q->rear);
}  

void Enqueue(Queue *q,int n)
{
    if(IsFull(q))
    {
        return;
    }
    q->data[q->rear] = n;
    q->rear = (q->rear+1)%QUEUE_SIZE;
}  

int Dequeue(Queue *q)
{
    if(IsEmpty(q))
    {
        return 0;
    }  

    int tmp = q->data[q->front];
    q->front = (q->front+1)%QUEUE_SIZE;
    return tmp;
}  

void main()
{
    Queue *q = InitQueue();
    int i;
    for(i=0;i<10;i++)
    {
        Enqueue(q,i*i);
    }  

    while(!IsEmpty(q))
    {
        int data = Dequeue(q);
        printf("%d-->",data);
    }
}

2 栈

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//    定义一个节点的结构
typedef struct node
{
    int member;            //数据域
    struct node * pNext;//指针域
}Node,*pNode;

//    定义一个栈结构
typedef struct stack
{
    pNode Top;            //栈顶
    pNode Bottom;        //栈底
}Stack,* pStack;

void InitStack(pStack );        //    初始化栈的函数
bool Push(pStack ,int);            //    进行压栈操作的函数
void TraverseStack(pStack );    //    遍历栈函数
bool Empty(pStack );            //    判断栈是否为空的函数
int Pop(pStack );                //    进行出栈操作的函数
void Clear(pStack );            //    清空栈的函数

int main(void)
{
    Stack s;                        //    定义一个栈
    int i;
    int num;
    int data;                        //    临时保存用户输入的数据
    int re_num;                        //    保存Pop函数的返回值
    InitStack(&s);
    printf("你想输入几个数据啊:");
    scanf("%d",&num);
    for (i = 0;i < num;i++)
    {
        printf("第 %d 个数:",i+1);
        scanf("%d",&data);
        if (Push(&s,data))                //    调用Push函数
        {
            continue;
        }
        else
        {
            printf("进行进栈操作失败!\n");
            exit(-1);
        }
    }
    TraverseStack(&s);                //    调用遍历函数
    printf("你想去掉几个数啊: ");
    scanf("%d",&data);
    printf("你去掉的数字是:");
    for (i = 0; i < data;i++)
    {
        re_num = Pop(&s);            //    调用Pop函数,并把返回值赋给re_num;
        printf("%d ",re_num);
    }
    printf("看看删除后还有啥:");
    TraverseStack(&s);
    printf("\n");
    Clear(&s);                        //    调用清空栈函数
    printf("遍历下看看栈清空没····\n");
    TraverseStack(&s);
    printf("\n");
    return 0;
}

//    进行栈的初始化的函数
void InitStack(pStack ps)
{
    ps->Top = (pNode)malloc(sizeof(Node));        //    分配内存空间给栈顶
    if (NULL == ps->Top)
    {
        printf("动态分配内存失败\n");
        exit(-1);
    }
    else
    {
        ps->Bottom = ps->Top;                    //    使栈底也指向栈顶空间
        ps->Top->pNext = NULL;                    //    栈顶指针置为NULL;
    }
    return ;
}

//    进行进栈操作的函数
bool Push(pStack ps,int data)
{
    pNode pNew = (pNode)malloc(sizeof(Node));    //    定义一个新节点,并分配内存空间
    if (NULL == pNew)
    {
        return false;
    }
    pNew->member = data;                        //    把要进栈的数据赋给新节点的member成员
    pNew->pNext = ps->Top;                        //    使新节点的指针指向栈顶
    ps->Top = pNew;                                //    把新节点作为新栈顶

    return true;
}

//    遍历栈的函数
void TraverseStack(pStack ps)
{
    pNode pNew = ps->Top;
    while(pNew!= ps->Bottom)                //    只要栈顶不等于栈底,循环
    {
        printf("%d ",pNew->member);            //    打印栈顶的成员member
        pNew = pNew->pNext;                //    栈顶指针向下移动一次
    }
    return ;
}

//    判断栈是否为空
bool Empty(pStack ps)
{
    if(ps->Top == ps->Bottom)    //    栈顶等于栈底,不就是栈中没数据么
    {
        return true;
    }
    else
    {
        return false;
    }
}

//    进行出栈操作函数
int Pop(pStack ps)
{
    pNode pSwap = NULL;
    int return_val;
    if (Empty(ps))                //判断栈是否为空,为空就不能进行出栈操作
    {
        exit(-1);
    }
    else
    {
        return_val = ps->Top->member;    //    把栈顶的成员member的值赋给return_val做为函数返回值
        pSwap = ps->Top;                //    使pSwap指向栈顶
        ps->Top = ps->Top->pNext;        //    使栈顶指向栈顶下一个节点
        free(pSwap);                    //    释放以前的栈顶空间
        return return_val;
    }
}

//    清空栈的函数
void Clear(pStack ps)
{
    pNode pNew = NULL;

    while (ps->Top != ps->Bottom)        //    栈顶和栈底不等,循环
    {
        pNew = ps->Top;                    //    使一个新节点和栈顶指向同一空间
        ps->Top = ps->Top->pNext;        //    使栈顶指向栈顶的下一个节点
        free(pNew);                        //    释放掉以前的栈顶空间
    }
    return ;
}

3 树

#include<stdio.h>
#include<stdlib.h>

typedef	int	ElemType;			//数据类型
typedef	int		Status;			//返回值类型

//定义二叉树结构
typedef struct BiTNode{
  ElemType	data;					//数据域
  struct BiTNode	*lChild, *rChlid;	//左右子树域
}BiTNode, *BiTree;

//先序创建二叉树
Status CreateBiTree(BiTree *T)
{
  ElemType ch;
  ElemType temp;

  scanf("%d", &ch);
  temp = getchar();

  if (-1 == ch)
    *T = NULL;
  else
  {
    *T = (BiTree)malloc(sizeof(BiTNode));
    if (!(*T))
      exit(-1);

    (*T)->data = ch;
    printf("输入%d的左子节点:", ch);
    CreateBiTree(&(*T)->lChild);
    printf("输入%d的右子节点:", ch);
    CreateBiTree(&(*T)->rChlid);
  }

  return 1;
}

//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
  if (NULL == T)
    return ;
  printf("%d ", T->data);
  TraverseBiTree(T->lChild);
  TraverseBiTree(T->rChlid);

}

//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
  if (NULL == T)
    return ;
  InOrderBiTree(T->lChild);
  printf("%d ", T->data);
  InOrderBiTree(T->rChlid);

}

//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
  if (NULL == T)
    return ;
  PostOrderBiTree(T->lChild);
  PostOrderBiTree(T->rChlid);
  printf("%d ", T->data);

}

//二叉树的深度

int TreeDeep(BiTree T)
{
  int deep = 0;
  if(T)
  {
    int leftdeep = TreeDeep(T->lChild);
    int rightdeep = TreeDeep(T->rChlid);
    deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
  }
  return deep;
}

//求二叉树叶子结点个数

int Leafcount(BiTree T,int &num)
{
  if(T)
  {
    if(T->lChild ==NULL &&T->rChlid==NULL)
      num++;
    Leafcount(T->lChild,num);
    Leafcount(T->rChlid,num);

  }
  return num;
}
//主函数
int main(void)
{
  BiTree T;
  BiTree *p = (BiTree*)malloc(sizeof(BiTree));
  int deepth,num=0 ;
  printf("请输入第一个结点的值,-1表示没有叶结点:\n");
  CreateBiTree(&T);
  printf("先序遍历二叉树:\n");
  TraverseBiTree(T);
  printf("\n");
  printf("中序遍历二叉树:\n");
  InOrderBiTree(T);
  printf("\n");
  printf("后序遍历二叉树:\n");
  PostOrderBiTree(T);
  printf("\n");
  deepth=TreeDeep(T);
  printf("树的深度为:%d",deepth);
  printf("\n");
  Leafcount(T,num);
  printf("树的叶子结点个数为:%d",num);
  printf("\n");
  return 0;
}

4 图

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAX 20   //图可以存储的最大节点数为20;
struct tnode
{
    struct tnode * next;//指向下一个临节点
    int data;//存放邻节点在数组中的位置
};
struct node
{
    int valu;//存放节点的值
    struct tnode * link;//指向邻节点
};
struct picture
{
    struct node nd[MAX];    //声明一个节点数组
    int count;  //图中的节点数
    char a; //建立的图的类型
};
struct picture * createpicture();
int search(struct picture *p,int value);//查找value在nd数组中的位置
void bfs(struct picture * q,int i,int visit[]); //广度优先遍历
void dfs(struct picture * q,int i,int visit[]);//深度优先遍历
void traversedfs(struct picture *p);
void traversebfs(struct picture *p);
int main()
{
    char a;
    struct picture *p;
    p=createpicture();
    while(1)
    {
        getchar();
        printf("现在将对图进行遍历,若使用广度优先遍历,请输入a,若使用深度优先遍历请输入b,清屏请输入c,退出请输入d:\n");
        scanf("%c",&a);
        if(a=='a')
        {
        printf("深度优先遍历如下:\n");
        traversebfs(p);
        }
        if(a=='b')
        {
        printf("广度优先遍历如下:\n");
        traversedfs(p);
        }
        if(a=='c')
        system("cls");
        if(a=='d')
        exit(0);
    }
    return 0;
}
struct picture * createpicture()
{
    int i,j,k,l;//l中存放返回的节点在数组中的位置
    char a;
    struct picture *p;
    p=(struct picture *)malloc(sizeof(struct picture));
    struct tnode * t;
    printf("请输入你要建立的图中的节点数以及图的类型(a表示无向图b表示有向图):\n");
    scanf("%d %c",&i,&a);
    p->count=i;
    p->a=a;
    printf("请依次输入各节点的值(每输完一个节点的值按回车结束):\n");
    for(i=0;i<p->count;i++)
    {
        scanf("%d",&j);
        p->nd[i].valu=j;
        p->nd[i].link=NULL;
    }
    for(i=0;i<p->count;i++)
    {
        printf("输入与数据值为%d的节点相邻的节点的数据值(每输完一个节点的值按回车结束),若不再含有相邻的值请输入-1\n",p->nd[i].valu);
        while(1)
        {
            scanf("%d",&k);
            if(k==-1)
                break;
            l=search(p,k);
            if(l!=-1)
            {
                t=(struct tnode *)malloc(sizeof(struct tnode));
                t->data=l;
                t->next=p->nd[i].link;
                p->nd[i].link=t;
            }
            else
                printf("无此数据值!\n");
            //getchar();
        }
    }
    return p;
}
int search(struct picture *p,int value)
{
    int i;
    for(i=0;i<p->count;i++)
    {
        if(value==p->nd[i].valu)
        {
            return i;
        }
    }
    return -1;
}
void traversedfs(struct picture *p)
{
    int i;
    int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
    for(i=0;i<p->count;i++)
    {
        visit[i]=0;
    }
    for(i=0;i<p->count;i++)
    {
        if(visit[i]==0)
        {
            dfs(p,i,visit);
        }
    }
    //getchar();
}
void dfs(struct picture * q,int i,int visit[])//i表示数组的下标值visit的下标与p中的下标是一一对应的关系
{
    struct tnode * w;
    printf("%d\n",q->nd[i].valu);
    visit[i]=1;
    w=q->nd[i].link;
    while(w!=NULL)
    {
        if(visit[w->data]==0)
        {
            dfs(q,w->data,visit);
        }
        else
        {
            w=w->next;
        }
    }
}
void traversebfs(struct picture *p)
{
    int i;
    int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
    for(i=0;i<p->count;i++)
    {
        visit[i]=0;
    }
    for(i=0;i<p->count;i++)
    {
        if(visit[i]==0)
        {
            bfs(p,i,visit);
        }
    }
    //getchar();
}
void bfs(struct picture * q,int i,int visit[])
{
    struct tnode *w;
    int a[MAX];//声明一个队列
    int f,r;
    int v;
    f=r=0;
    visit[i]=1;
    printf("%d\n",q->nd[i].valu);
    a[r]=i;
    r++;//进行入队操作
    while(f!=r)
    {
        v=a[f];
        f++;//岀队操作
        w=q->nd[v].link;
        while(w!=NULL)
        {
            if(visit[w->data]==0)
            {
            visit[w->data]=1;
            printf("%d\n",q->nd[w->data].valu);
            a[r]=w->data;
            r++;
            }
            w=w->next;
        }
    }
}

上述工程下载

http://pan.baidu.com/s/1o8qyWLs

文件名

sjjgdemo-c

5 C数据结构资源链接

http://outofmemory.cn/code-snippet/7235/C-language-scheme-create-and-BFS-DFS-bianli

http://blog.csdn.net/Golden_Shadow/article/category/745332

http://www.oschina.net/code/list/?lang=cpp&catalog=programming-base&show=time

时间: 2024-11-09 06:16:46

一些可运行的C语言数据结构代码的相关文章

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

cefSharp 设置运行时系统语言

在使用用CefSharp使用过程中,系统用了很多第三方控件.这些控件很多能够根据浏览器设置的语言来进行控件展示对应语言. 在cefSharp可以设置系统语言,代码如下: CefSharp.Settings setting = new CefSharp.Settings(); string flashPath = Application.StartupPath+ @"\Plug\gcswf32.dll"; setting.AddPluginPath(flashPath); //设置语言

C语言的代码内存布局详解

一个程序本质上都是由 BSS 段.data段.text段三个组成的.这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题. BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:在采用段式内存管理的架构中,数据段(da

C语言的代码内存布局

一个程序本质上都是由 BSS 段.data段.text段三个组成的.这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题. BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:在采用段式内存管理的架构中,数据段(da

1987年国际C语言混乱代码大赛获奖的一行代码

macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+ 这是CoolShell博主之前做了一个很有意思的在线puzzle,仿照一些前端过关的游戏,做了几个和程序员有关的迷题,一个通关游戏,这个事测试的第二题.并为通关的前十名送上<Unix环境高级编程(第三版)>(感谢@出版圈郭志敏 赞助)或一个马克杯(感谢@linux命令行精选网 赞助))这些谜题很有趣同时也有一定的难度.由于水平有限,我并没有通关,但我

[Asp.net 5] Localization-Asp.net运行时多语言

本节介绍的是Microsoft.AspNet.Localization工程.该工程是运行在Asp.net 5环境中的运行时多语言设置. ASP.net 5中间件技术 在新的Asp.net 5中,可以将组件组册到asp.net环境中.注册是通过接口IApplicationBuilder的扩展方法实现的. public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware,

读谭浩强C语言数据结构有感(1)

1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元素:数据有集合和元素的区别,集合里的个体就是数据元素,相对应的就是数据结构. 线性表: 说简单一点,就是线性存储结构,每个表中有大量的元素,这些元素在物理位置中都是连接起来的. 这些元素有直接前驱和直接后继.线性表的位置是相邻的. 比如,位置1,位置2,位置3......位置N. 还有一点,线性表的

JS 运行、复制、另存为 代码。

//运行代码 function runEx(cod1) { cod = document.getElementById(cod1) var code = cod.value; if (code != "") { var newwin = window.open('', '', ''); newwin.opener = null newwin.document.write(code); newwin.document.close(); } } //复制代码 function doCopy

appium在真机上运行IOS实例要注意的几点:包括python和java运行log 和部分关键代码

最近在研究appium对于IOS的自动化测试,发现在真机上运行appium提供的开源的例子遇到了几个block,询问了一个这个方便面的高手并且总结网上搜到的帖子,现在综合一下. appium 在模拟器中跑,只需要注意app=path appium真机上运行:1:运行的时候要将APP安装到真机上面 2:运行的时候,不能再开instrument 3:命令行里面启动的时候,参数写错了应该是 appium -U 3d2cad7288a64a5445aa98a2cc220132f2cddd1c --app