网上有很多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