一、链表的,尾插,删除,插入
在链表的尾部插入节点:
void pushBack(struct Node *phead ,int n)
{
if(isEmpty(phead))
{
pushFront(phead,n);
}
else
{
struct Node *pnew = malloc(sizeof(struct Node));
struct Node *p = phead->next;
while(p)
{
p= p->next;
}
p->next = pnew;
pnew->next = NULL;
pnew->data = n;
}
}
删除链表中的头节点:
void popFront(struct Node *phead)
{
if(!isEmpty(phead))
{
struct Node *p = phead->next;
phead->next = p->next;
free(p);
}
}
删除链表中的尾节点
void popBack(struct Node *phead)
{
if(sizeList(phead) >= 2)
{
struct Node *p = phead->next;
while(phead->next->next)
{
p = p->next;
}
free(p->next);
p->next = NULL;
}
else
{
popFront(phead);
}
}
清除链表
void clear(struct Node *phead)
{
while(phead->next)
{
popFront(phead);
}
}
二、共用体
共用体是一种特殊的数据结构,允许将不同的数据类型存储在同一内存位置。只可以存储一个成员。
共用体的定义
union demo
{
int i;
short s;
char c;
};
由于共用体中的所有成员共享同一内存位置,所以修改一个成员会覆盖之前存储的值。
三、枚举
枚举是一种用户定义的数据类型,它由命名的整型常量组成。枚举可以为一组相关的常量定义有意义的名称,而不是直接使用数字。
enum 枚举名 {
枚举值1,
枚举值2,
枚举值3,
...
};
枚举中的值实际上是整型值。
四、typedef
typedef
用于给已有的数据类型定义新的名字,提高代码的可读性和可维护性。
typedef unsigned long ulong;
ulong a = 10;
printf("a : %lu\n", a);
定义复杂的结构类型时,typedef
也非常有用
五、位运算
1. 位运算符及其用法
按位与 (&
)
按位与运算符对两个数的每一位进行与操作,只有当两位都为1时,结果才为1,否则为0。
常用于清零某些特定位,或者检测某些特定位是否为1。
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a & b; // 结果: 0001, 即 1
2.按位或 (|
)
按位或运算符对两个数的每一位进行或操作,只要有一位为1,结果就是1。
常用于设置某些特定位为1。
int a = 5; // 0101
int b = 3; // 0011
int result = a | b; // 0111, 即 7
3.按位异或 (^
)
按位异或运算符对两个数的每一位进行异或操作,当两位不同时,结果为1,相同时结果为0。
常用于翻转某些特定位,或者实现加密和解密操作
int a = 5; // 0101
int b = 3; // 0011
int result = a ^ b; // 0110, 即 6
4.按位取反 (~
)
按位取反运算符对一个数的每一位进行取反操作,0变1,1变0。
常用于快速计算负数的补码形式。
int a = 5; // 0000 0101
int result = ~a; // 1111 1010, 即 -6 (在有符号整数中)
5.左移 (<<
)
左移运算符将一个数的各二进制位全部左移若干位,右边补0。
常用于快速乘以2的幂。
int a = 5; // 0000 0101
int result = a << 1; // 0000 1010, 即 10
6.右移 (>>
)
右移运算符将一个数的各二进制位全部右移若干位。
常用于快速除以2的幂。有符号数和无符号数的右移存在差异。
int a = 5; // 0000 0101
int result = a >> 1; // 0000 0010, 即 2