双向链表

/*双向链表*/
#include<stdio.h>
typedef struct dbnode
{
    int num;
    char name[9];
    char sex[3];
    int age;
    int score;
    struct dbnode *prior;   /*前指针*/
    struct dbnode *next;    /*后指针*/
}Node,*LinkList;            /*结点类型、头指针类型*/
LinkList CreateLinkList()   /*创建结点*/
{
    LinkList head;          /*链表头指针*/
    Node *New,*End;         /*新指针、尾指针*/
    int i,x;
    head=(LinkList)malloc(sizeof(Node));/*生成头结点*/
    head->prior=head;       /*头指针prior指向自己*/
    head->next=head;        /*头指针next指向自己*/
    End=head;               /*尾指针指向头指针*/
    printf("请输入链表的长度:\n");
    scanf("%d",&x);
    for(i=1;i<=x;i++)
    {
        printf("请输入学号、姓名、性别、年龄、成绩:\n");
        New=(Node*)malloc(sizeof(Node));/*创建新结点*/
        scanf("%d%s%s%d%d",&New->num,New->name,New->sex,&New->age,&New->score);/*输入结点信息*/
        End->next=New;      /*尾指针next指向新结点*/
        New->prior=End;     /*新结点prior指向尾结点*/
        New->next=head;     /*新结点next指向头结点*/
        head->prior=New;    /*头指针prior指向新结点*/
        End=New;            /*尾结点指向新结点*/
    }
    return(head);
}
void OutLinkList(LinkList head) /*输出结点*/
{
    Node *p;
    int i=1;
    p=head;
    p=p->next;
    printf("--------学生信息档案表--------\n");
    while(p!=head)
    {
        printf("Num %d:%d,%s,%s,%d,%d.\n",i++,p->num,p->name,p->sex,p->age,p->score);
        p=p->next;
    }
}
LinkList GetLinkList(LinkList head,int i)   /*读表元素*/
{
    Node *p;
    p=head->next;
    int c=1;
    while((c<i)&&(p!=head)) /*当未到第i结点且未到头结点继续后移*/
    {
        p=p->next;
        c++;
    }
    if(c==i)                /*找到第i个结点*/
        return p;
    else
        return NULL;        /*查找失败*/
}
void InsertLinkList(LinkList head,int i) /*插入结点*/
{
    Node *End,*New,*x;
    if(i==1)
        End=head;
    else
        End=GetLinkList(head,i-1);
    if(End==NULL)
        printf("找不到插入位置");
    else
    {
        New=(Node *)malloc(sizeof(Node));
        printf("请输入学号、姓名、性别、年龄、成绩:\n");
        scanf("%d%s%s%d%d",&New->num,New->name,New->sex,&New->age,&New->score);
        New->prior=End;
        New->next=End->next;
        End->next->prior=New;
        End->next=New;
    }
}
void DeleteLinkList(LinkList head,int i)    /*删除结点*/
{
    Node *p;
    if(i==1)
        p=head;
    else
        p=GetLinkList(head,i);  /*查找第i个结点位置*/
    if(p!=NULL)
    {
        p->prior->next=p->next;     /*p前驱结点的后链指向p的后继结点*/
        p->next->prior=p->prior;    /*p后继结点的前链指向p的前驱结点*/
        free(p);                    /*释放*p的空间*/
    }
    else
        printf("找不到删除位置\n");
}

main()
{
    LinkList head;
    int n;
    head=CreateLinkList();
    OutLinkList(head);
    printf("请输入插入的位置:\n");
    scanf("%d",&n);
    InsertLinkList(head,n);
    OutLinkList(head);
    printf("请输入删除位置:\n");
    scanf("%d",&n);
    DeleteLinkList(head,n);
    OutLinkList(head);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻58

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值