• 双向链表


    我主要说一下双向链表的创建,顺便说了一下删除尾节点的实现

    [00:51:51] gcc doubledirectlink.c 
    [00:51:55] ./a.out
    1->2->3->4->5now del last
    1->2->3->4deled
    [00:51:57] cat doubledirectlink.c 
    #include<stdio.h>
    #include<malloc.h>
    typedef struct list 
    {
        int data;//记录数据
        struct list *pre;//指向前一个节点
        struct list *next;//指向后一个节点
    }*link;//下面我们就可以用link直接来使用这个结构体
    link front=NULL,rear,ptr=NULL,head=NULL;//front是用来暂存返回的头节点的,因为我程序是这么写的,我是直接打印两次链表了。ptr是用来记录返回的头节点的,head是指链表里的表头,rear是表尾
    link push(int item)//插入一个元素
    {
        link newnode=(link)malloc(sizeof(link));//开空间
        newnode->data=item;//放入数据item
        if(head==NULL)//如果该链表为空,让其头尾节点都是这个新节点
        {
            head=newnode;
            newnode->next=NULL;
            newnode->pre=NULL;//注意头节点的前一个以及尾节点的下一个都必须指向空,否则无法判断出链表是否结束
            rear=newnode;
        }
        else
        {
            rear->next=newnode;//在尾节点插入该节点
            newnode->next=NULL;
            newnode->pre=rear;//该节点指向前一个节点rear,因为上面的rear->next=newnode,所以这样就成为双向的了
            rear=newnode;   //多了这个节点后,我们把这个节点记录为最后一个节点
        }
        return head;//需要返回头节点,否则打印的时候找不到头节点
    }
    void del()
    {
    rear=rear->pre;//让倒数第二个节点代替最后一个节点
    rear->next=NULL;//注意最后的节点的下一个节点还需要指向空
    }
    int main()
    {   
        int i,n,a[5]={1,2,3,4,5};
        for(i=0;i<5;i++)
        {   
            if(i==0)
                ptr=push(a[i]);//随便录入一个数后就记录它的头节点用于方便打印
            else
                push(a[i]);
        }
        front=ptr;//因为我在删除最后一个节点后还需要打印链表,如果我不记录头阶段,下面的while循环ptr=ptr->next会破坏掉已经记录好的头节点
        while(ptr)
        {
            printf("%d->",ptr->data);
            ptr=ptr->next;
        }
        printf("now del last
    ");//使用两个是因为我需要删除后面多余的->符号
        del();//删除最后一个节点
        ptr=front;//让ptr重新赋值为头节点
        while(ptr)
        {
            printf("%d->",ptr->data);
            ptr=ptr->next;
        }
        printf("deled
    ");
        return 0;
    }
    [00:52:04] 
    
  • 相关阅读:
    数据不是搜集起来的,是沉淀下来的,跟脚印一样,脚印不是修路的人搜集起来的,只要有了路就一定有脚印,不可能说修一条路不留下脚印,世界上没有这样的路
    VC6.0编译的DLL文件能否反编译知道里面的代码?
    Why does the PDB format change every release?
    mysql_query与 mysql_real_query区别
    如何把Backtrack 5安装到U盘/Backtrack 4安装方法
    FreeBSD:像Linux下一样使用vim
    栈的出栈序列个数
    npm outdated -g --depth=0
    npm Updating packages downloaded from the registry
    TypeScript安装
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730642.html
Copyright © 2020-2023  润新知