OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3367|回复: 1

双链表代码

[复制链接]

5

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-10-18
在线时间
5 小时
发表于 2018-10-29 00:14:42 | 显示全部楼层 |阅读模式
//注意:该文件操作的链表为带头结点双向链表,头结点数据为-1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0

typedef int data_t;
typedef struct DulNode
{
        data_t data;
        struct DulNode *prior;
        struct DulNode *next;
}DulNode,*DuLinkList;

int GetElem(DuLinkList L,int i,data_t *data)//读取双向链表的第i个元素
{
        int j;
        DuLinkList p;
        p = L;
        j = 0;
        while(p && j<i)
        {
                p = p->next;//让p指向下一个节点
                j++;
        }
        if(!p)
        {
                printf("第%d个位置不存在!\n",i);
                return ERROR;
        }
        *data = p->data;
        return OK;
}

int ListInsert(DuLinkList L,int i,data_t e)
{
        int j;
        DuLinkList p,s;
        p=L;
        j=1;
        while(p && j<i)
        {
                p=p->next;
                j++;
        }
        if(!p)
        {
                printf("第%d个位置不存在!\n",i);
                return ERROR;
        }
        s=(DuLinkList)malloc(sizeof(DulNode));
        s->data=e;
        s->prior=p;
        s->next=p->next;
        if(p->next)
                p->next->prior=s;
        p->next=s;
        return OK;
}

int ListDelete(DuLinkList L,int i,data_t *e)
{
        int j;
        DuLinkList p;
        p=L;
        j=0;
        while(p && j<i)
        {
                p=p->next;
                j++;
        }
        if(!p)
        {
                printf("第%d个位置不存在!\n",i);
                return ERROR;
        }
        *e=p->data;
        if(p->next!=NULL)
        {
                p->prior->next=p->next;
                p->next->prior=p->prior;
        }
        else
        {
                p->prior->next=p->next;
        }
        free(p);
        p=NULL;
        return OK;
}

DuLinkList CreateEmptyList()
{
        DuLinkList p;
        p = (DuLinkList)malloc(sizeof(DulNode));
        if(p==NULL)
        {
                perror("CreateEmptyList error");
                exit(0);
        }
        p->prior=NULL;
        p->next=NULL;
        //p->data=-1;
        return p;
}

DuLinkList CreateList(DuLinkList L,int n)
{
        DuLinkList p,r;
        int i;
        srand(time(NULL));
        r = L;
        for(i=0;i<n;i++)
        {
                p = (DuLinkList)malloc(sizeof(DulNode));
                p->data = rand()%100+1;
                r->next = p;
                p->prior = r;
                r = p;
        }
        r->next = NULL;
        return L;
}

int ClearList(DuLinkList L)
{
        DuLinkList p,q;
        p=L->next;
        while(p)
        {
                q=p->next;
                free(p);
                p=q;
        }
        L->next=NULL;
        return OK;
}

int PrintList(DuLinkList L)
{
    DuLinkList p=L->next;
    while(p)
    {

        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

int main()
{
        /*
    DuLinkList head;
        head = CreateEmptyList();
    head = CreateList(head,15);
    int i=5;
    data_t data=12;
    PrintList(head);
    printf("插入head第%d个位置,数据为%d\n",i,data);
    ListInsert(head,i,data);
    printf("插入后链表为:\n");
    PrintList(head);
    i=8;
    ListDelete(head,i,&data);
    printf("删除head第%d个位置,删除数据为%d\n",i,data);
    printf("删除后链表为:\n");
    PrintList(head);
    if(ClearList(head)==OK)
    {
        printf("head已被成功删除!\n");
    }
        */
    return 0;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2018-10-29 08:26:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表