20140427 字节序 小尾 大尾; 编码:原码,反码,补码;单链表头结点的作用

1、字节序

0x1234

小尾:

内存地址         存放内容

0x4000            0x34

0x4001            0x12

大尾:

内存地址         存放内容

0x4000            0x12

0x4001            0x34

//结果是-59,-2
#include<stdio.h>
#include <string.h>
struct bitstruct
{
    int b1:7;
  //  int  :2;
    int b2:2; 
};

void main()
{
    bitstruct b;
    memcpy(&b,"EMC ",sizeof(b));//EM:(1010 0010 1011 0010)
    //计算时需要逆转:
    //b.b1:1000101(1010001逆序)
     //b.b2:10(01逆序)
    //分别求b.b1 和b.b2的补码(取反加1)
    printf("%d,    %d",b.b1,b.b2);
}

2、什么是编码?原码,反码,补码

将一个真值表示成二进制字串的机器数的过程就称为编码

无符号数没有原码、反码和补码一说。带符号整数有原码、反码、补码等几种编码方式。

原码即直接将真值转换为其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式

正整数的原码、反码和补码都一样

负数的反码是对原码的除符号位外的其他位进行取反后的结果。

补码是先求原码的反码,然后在反码的末尾位加1 后得到的结果,即补码是反码+1

3、单链表的建立,测长,和打印

//尾插法:建立带头结点head的单链表
#include<stdio.h>
#include<iostream>
#include<malloc.h>
typedef struct student
{
    int data;
    struct student *next; 
}node;

node *create( )   //尾插法:建立带头结点head的单链表
{
    node * head,*rear,*s;
    int x=0;
    head=(node *)malloc(sizeof(node *));
    head->data=0;
    printf("please input data: ");
    scanf("%d",&x);
    rear=head;
    while(x!=0)
    {
        s=(node *)malloc(sizeof(node));
        s->data=x;
        rear->next=s;
        rear=s;
        head->data++;
        printf("please input data: ");
        scanf("%d",&x);
    }
    rear->next=0;   //这句话一定加上,不然后果很严重
    return head;
}
int length(node *head)
{
    int n=0;
    node *rear=head->next;
    while(rear!=NULL)
    {n++;    rear=rear->next;}
    printf("the length is %d\n",n);
    return n;
}
void display(node *head)
{
    node *rear=head->next;
    while(rear!=NULL)
    {
        printf("%d ",rear->data);
        rear=rear->next;
    }
    printf("\n");
}
void main()
{
    node *head=create();
    length(head);
    display(head);
}

Q:   为什么需要表头结点head

A:    http://blog.csdn.net/leo115/article/details/8602621

1、防止单链表是空的而设的.当链表为空的时候,带头结点的头指针就指向头结点.如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL.

2、是为了方便单链表的特殊操作,插入在表头或者删除第一个结点.这样就保持了单链表操作的统一性!

3、单链表加上头结点之后,无论单链表是否为空,头指针始终指向头结点,因此空表和非空表的处理也统一了,方便了单链表的操作,也减少了程序的复杂性和出现bug的机会。

4、对单链表的多数操作应明确对哪个结点以及该结点的前驱。不带头结点的链表对首元结点、中间结点分别处理等;而带头结点的链表因为有头结点,首元结点、中间结点的操作相同 ,从而减少分支,使算法变得简单 ,流程清晰。对单链表进行插入、删除操作时,如果在首元结点之前插入或删除的是首元结点,不带头结点的单链表需改变头指针的值,在C 算法的函数形参表中头指针一般使用指针的指针(在C+ +中使用引用 &);而带头结点的单链表不需改变头指针的值,函数参数表中头结点使用指针变量即可。

4、 TCP 三次握手建立连接/四次握手关闭连接 及 状态迁移图

http://blog.163.com/pandalove@126/blog/static/98003245201221441436687/

posted @ 2014-04-27 20:33  yexuannan  阅读(459)  评论(0编辑  收藏  举报