1,关于链表的一些操作
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next; //指针8字节
//struct node p; 此种写法不可以,不能自己套自己
//NODE *next; 此种写法也不可以,执行到这里时,typedef还没有生效
}NODE;
NODE* deletenode1(NODE* head,int n); //函数声明要在typedef之后,不然NODE无法识别
void printnode(NODE* head);
NODE* insertnode(NODE* head,int n);
NODE* insertnode1(NODE* head,int n);
int main(){
NODE *head;
head=(NODE*)malloc(sizeof(NODE)); //给头结点分配内存
head->data=1;
head->next=NULL;
/*
head->next=(NODE*)malloc(sizeof(NODE)); //给第二个分配内存
head->data=1;
printf("%d\n",head->data);
head->next->data=1;
printf("%d\n",head->next->data);
*/
/*
NODE *p; //流动指针
p=head;
p->next=(NODE*)malloc(sizeof(NODE));
p=p->next; //此时就可以用循环建链表了
*/
//链表构造
NODE *s;
s=head;
for(int i=0;i<4;i++){
s->next=(NODE*)malloc(sizeof(NODE));
s=s->next;
s->data=2*i+1;
}
s->next=NULL; //链表结束
//链表删除
head=deletenode1(head, 1); //注意函数调用的形式,最开始我写成了NODE* deletenode(head,3);😭
printnode(head);
//链表插入
head=insertnode(head,6);
printnode(head);
head=insertnode1(head,4);
printnode(head);
}
void printnode(NODE* head){ //打印链表
NODE *q;
q=head->next;
while(q!=NULL){
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
NODE* deletenode1(NODE* head, int n){
NODE* p,*q;
if(head->data==n){
p=head;
head=head->next;
free(p);
return head;
}
q=head;
p=head->next;
while(p!=NULL){
if(p->data==n){
q->next=p->next;
free(p);
return head;
}
p=p->next;
q=q->next;
}
printf("not found\n");
return head;
}
NODE* insertnode(NODE* head,int n){ //插入有四种情况
NODE* p,*q,*r;
p=head;
q=head;
r=(NODE*)malloc(sizeof(NODE));
r->data=n;
r->next=NULL;
if(head==NULL){ //一定要写NULL,空表判断
head=r;
}else{
while(p->data<n&&p->next!=NULL){
q=p;
p=p->next;
}
if(p->data>=n){ //在头部插入
if(p==head){
r->next=head;
head=r;
}else{ //一般情况插入
r->next=p;
q->next=r;
}
}else{ //在尾部插入
p->next=r;
}
}
return head;
}
NODE* insertnode1(NODE* head,int n){
NODE* p,*q,*r;
p=head;
r=(NODE*)malloc(sizeof(NODE));
r->data=n;
r->next=NULL;
if(head==NULL){ //空结点
head=r;
}
if(p->data>n){ //插在头部
r->next=p;
head=r;
}
while(p->data<n&&p->next!=NULL){
q=p;
p=p->next;
}
if(p->next==NULL){ //插在尾部
p->next=r;
}else{
r->next=p; //一般插入,且要用if-else
q->next=r;
}
return head;
}
2,共用体
#include <stdio.h>
//共用体
union sample{
short a;
char b;
float c;
}; //一次只有一个成员生效
struct sample1{
short a;
char b;
float c;
};
int main(){
union sample a1;
struct sample1 a2;
printf("%lu\t%lu\t",sizeof(a1),sizeof(a2)); //用%lu输出大小
a1.b='a';
putchar(a1.b);
a1.a=123;
printf("%hd\n",a1.a);
}
/*
输出结果:
4 8 a123
*/
3,枚举数据类型
#include <stdio.h>
//枚举数据类型
enum options{ascend,descend};
int main(){
enum options a3,a4;
a3=ascend;
printf("%d\n",a3); //会输出0
a4=descend;
printf("%d\n",a4); //会输出1
}