12——链表一些总结

本文介绍了C语言中链表的创建、删除和插入操作,以及共用体和枚举数据类型的使用示例,展示了基本的编程技巧。
摘要由CSDN通过智能技术生成

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值