博文
冒泡排序法的几种实现(2007-02-20 22:22:00)
摘要: 一、 汇编实现(基于51单片机)
ORG 0000H
MOV R1,#0AH ;长度送R1
MOV R0,#50H ;A=50H
MOV A,#0AH ;A=0AH
INIT0: MOV @R0,A ;将A内的值赋给R0指向的地址,(50H)= A
DEC A ;A的值自减1
INC R0 ;R0的值自加1,实现指针的向上偏移,R0=51H
DJNZ R1,INIT0
PXCX: MOV R3,#50H ;R3=50
QL4: MOV A,R3 ;指针送A=50H
MOV R0,A ;R0=50H
MOV R7,#0AH ;长度送R7=0AH
CLR 00H ......
一种封装报文的方法(2007-02-04 22:05:00)
摘要:
假设需要封装的报文为pucMBufMsg,该缓存前RESERVED_LEN个字节预留为(报文信息+MAC+UDP+IP),从第RESERVED_LEN +1个字节为数据。具体使用方法如下:
#define RESERVED_LEN 100 /*预留假设100个字节*/
ULONG *p = (ULONG*)pucMBufMsg; /*定义ULONG型指针指向报文*/
p[0] = ulIndex; /*第一个4字节可以放置唯一标识,或用户标识,用于区别*/
p[1] = (ULONG)(pucMBufMsg + RESERVED_LEN); /*指向数据取*/
p[2] = ulLen; /*数据的有效长度*/
当我们需要再往缓存里追加数据时,比如希望进行IP封装时只需做如下操作
ULONG IPHeadLen = 20; /*20B*/
p[1] -= (ULONG*)(UCHAR*)p[1]- IPHeadLen ); /*指向新的数据区*/
p[2] += IPHeadLen ; /*数据的有效长度*/
memcpy((void*)p[1], pucIPHead, IPHeadLen);
可以将以上的一些操作进行如下的封装:
/*从MBUF中取报文首指针*/
UCHAR * MBUF_MTOD(UCHAR *pMbuf)
{
ULONG ......
二叉树的相关操作(转载)(2006-03-28 10:03:00)
摘要:二叉树的相关操作,转载http://www.programfan.com/club/showbbs.asp?id=135842
作者:lyt8604@sohu.com
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define OK 1
#define MAXLEN 100
typedef int ElemType;
typedef struct bnode
{
ElemType data;
struct bnode *left,*right;
}bnode,*btree;
int creat(btree &b)//创建二叉树并向树输入结点
{
void insert(btree &b,bnode *t);
int x;
bnode *s;
b=NULL;
scanf("%d",&x);
while(x!=0)
{
s=(bnode *)malloc(sizeof(bnode));
s->data=x;
s->left=NULL;
s->right=NULL;
insert(b,s);
scanf("%d",&x);
}//输入结点以0结束
return OK ;
数组与链表等顺序表逆置(2006-03-27 14:09:00)
摘要:一)数组的逆置
(1)算法
#indclude<stdio.h>
#define N 8
main()
{
int array[N] = {100,90,80,70,60,50,50,40};
int i,j,t;
for(i=0,j=N-1;i<j; i++, j--)
{
t = array[i];
array[i] = array[j];
array[j] = t;
}
for(i=0,i<listsize;i++)
printf("%d",qlist.data[i])
}
(2)时间复杂度
由于只需循环N/2即可完成逆置,所以时间复杂度为O(N/2).
(二)单向链表的逆置
(1)算法
......
单链表逆置(2006-03-27 11:16:00)
摘要:单链表的逆置的实现:
(1)算法
struct link
{
int data;
struct link *next;
};
link reverse(link x)
{
if( NULL==x )
return NULL;
link t=NULL;
link r=NULL, y=x; //(0)
while(y!=NULL)
{
t = y->next; //(1)
y->next = r; //(2)
r = y; //(3)
y = t; //(4)
}
return r; //返回逆置后的链表
}
(二)原理
(0)(1)(2)(3)(4)分别对应以上程序的各序号
第一次while循环
-------------------------------------------
(0) ......
单向链表的插入、查找和遍历方法(2006-03-25 15:23:00)
摘要:#include<stdio.h>
#include<conio.h>
#define N 3
int Link_Length = N; //记录链表的长度
//定义结构体
struct t_node
{
int data;
struct t_node *next;
};
定义别名
typedef struct t_node Node;
//定义链表变量
Node * example_link = NULL;
/*
*功能:获取指定位置的节点的地址
*输入:plink=链表,i=索引位置,从零开始
*输出:无
*返回值:索引节点的地址
*/
Node * get(Node *plink,int i)
{
if(NULL == plink)
return NULL;
int count = 0;
Node * pNext = plink;
while(count<i && pNext != NULL)
{
count++;
pNext = pNext->next;
}
return pNext;
}//endget()
/*
*功能:向指定链表中的指定位置前插入节点
*输入:plink=链表,x=新节点的值,i=插入位置
*输出:plink=插入节点后的新链表
*返回值:成功返回true, 否则为false
*/
bool Insert(Node *&plink,int x,int i)
{
Node *s = NULL; //新节点
Node *q = NULL; //中间变量
//构建新节点
&nb......
关于双向链表的一些分析(2006-03-25 14:59:00)
摘要:跟大家门交流一下:
一、插入操作(insert)
(一)基本原理
双链表就好像是手拉手站成一排的人,每个人的右手(next)拉着下一个人,左手(prior)拉着前一个人,每两个人之间有两支手互联.插入操作实际是向队伍中增加人员,他需要拉上左右两边的人,即共三个人要发生关系,由于每两个人之间有两支手互联,所以要发生4次操作.如已知节点
q,p,需插入s,(称为原型吧).
----------------------------------
q->next
--->
q p
<---
p->prior
---------------------------------
现在假设需插入节点s,则需进行以下4次操作:
-----------------------------------------
(1)(2)完成q与s的握手
(1) q->next = s;
(2) s->prior = q;
q->next
--->
q s
<---
s->prior
......