C语言链表的基础操作 建立,输出,删除,插入

**链表是C语言中最难的一个内容,掌握链表,并且不看返利,单独写出无问题的链表基础操作的代码,可以说已经初步掌握了C语言这门程序语言,以下为博主自己写的链表操作代码,注释较多,清晰易懂,大家可以参考以下。
我也没学多久,有问题也可以加博主QQ:2942504702 一起交流。**

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct node)
typedef struct node//用typedef代替结构体类型
{
    int num;
    float data;
    struct node *next;
} Node;
Node *creat(void);//链表建立函数声明
void print(Node *head);//输出
void del(Node *head);//删除
void insert(Node *head);//插入
int main()
{
    Node *head;
    head=creat();//调用链表创建函数 返回一个头指针地址
    del(head);
    insert(head);
}
Node *creat(void)
{
    int n=0;
    Node *p1,*p2,*head;
    head=NULL;
    printf("输入链表结点数据:\n");
    p1=p2=(Node *)malloc(LEN);//第一个节点开辟一个空间
    scanf("%d%f",&p1->num,&p1->data);
    while(p1->num!=0)//以0为输入结束标志
    {
        n++;//记录节点数
        if(n==1) head=p1;//n为1 第一个节点做表头
        else p2->next=p1;//继续开辟结点
        p2=p1;//下一个节点地址赋给p2备用
        p1=(Node *)malloc(LEN);
        scanf("%d%f",&p1->num,&p1->data);
    }
    p2->next=NULL;//表尾
    return head;//返回链表首地址
    printf("输出链表数据:\n");
    print(head);
}
void print(Node *head)
{
    Node *p;
    if(head==NULL) printf("\n无任何数据可以输出\n");
    for (p=head; p!=NULL; p=p->next)
        printf("%d \t %.2f\n",p->num,p->data);
    printf("\n");
}
void del(Node *head)
{
    int del_num;
    Node *p1,*p2;
    printf("\n输入链表中要删除的结点:\n");
    scanf("%d",&del_num);
    p1=p2=head;
    if(head==NULL) printf("\n无任何数据可以输出\n");
    else//非空链表
    for (; p1!=NULL; p1=p1->next)//结点不为空 执行循环体 否则继续指向下一个节点
    {
        if(p1->num==del_num)//找到指定结点
        {
                if(p1==head) head=p1->next;//指定结点为表头
                else  p2->next=p1->next;//表中
                free(p1);
                p1=p2;//结点被删除后 前一个结点p2作当前结点 p1指向当前结点
        }
    }
    printf("\n删除指定结点后的链表:\n");
    print(head);
}
void insert(Node *head)
{
    Node *p1,*p2,*p3,s;
    printf("\n输入需要插入的结点数据:\n");
    scanf("%d%f",&s.num,&s.data);
    p3=(Node *)malloc(LEN);//给插入的结点开辟一个空间
    p3=&s;//地址赋给p3
    p1=head;
    if(head==NULL)//链表为空 p3作表头
    {
        head=p3;
        head->next=NULL;
    }
    else
    {
        for (; p3->num > p1->num&&p1->next!=NULL; p1=p1->next) p2=p1;//未找到插入位置 结点后移
        if(p3->num<=p1->num)//找到插入位置
        {
            if(p1==head) p3=head;//插入位置在表头
            else//表中
            {
                p2->next=p3;//插入p1结点之前
                p3->next=p1;
            }
        }
        else
        {
            p1->next=p3;//表尾
            p3->next=NULL;
        }
    }
    printf("\n插入指定结点后的链表:\n");
    print(head);
}


猜你喜欢

转载自blog.csdn.net/qq_42313319/article/details/81281979