/*用 C 语言实现一个
双向链表 DLinkList,要求:
      链表结点的数据域由 ‘序号’ 和 ‘数值’ 两部分组成(类型均为 int)。内
容不限,由编程者自己输入,但要求第 10 个结点必须为 (2016,1201);
并依次执行以下操作:
1. 打印此双向链表的第 7 个结点;
2. 在此双向链表的第 2 和第 3 个结点之间插入新的节点 (57,1972);
3. 删除此双向链表的第 9 个结点;*/

#include <stdlib.h>
#include <stdio.h>
typedef struct node 
{
int order;  
int number;	 
struct node *prior,*next;
}DLinkList;

DLinkList *creat(int n);
void Print(DLinkList *head);
void Insert(DLinkList *head);
void Delete(DLinkList *head);


main(void)
{
int n; 
DLinkList *head; 
DLinkList *p;
printf("总的节点数:\n");
scanf("%d",&n);
head=creat(n); //把所新建的单链表头地址赋给head
p=head;
Print(head);
Insert(head);
Delete(head);
do{
printf("序号:%d\n",p->order);
printf("数值:%s\n",p->number);
p=p->next;
}while(p!=head);
return 0 ;
}

DLinkList *creat(int n)   
{
DLinkList *p,*h,*s;
int i;
for(i=0;i<n;i++)
{
if((s=(DLinkList *) malloc(sizeof(DLinkList)))==NULL) //分配新存储空间并检测
{
printf("不能分配内存空间!");
exit(0);
}
if(i)p->next=s; 
        else{
        h=s;
}
printf("请输入第%d个序号:",i+1);
scanf("%d",&s->order);
printf("请输入第%d个数值:",i+1);
scanf("%s",s->number);
s->next=NULL;
p=s;
}
p->next=h; 
return(h);
}

/* 打印此双向链表的第 7 个结点*/
void Print(DLinkList *head)
{
DLinkList *p;
for(int i=0;i<5;i++)
head=head->next;
p=head->next;
head->next=head->next->next;
printf("第7个结点为:%d\t%d",p);
return;
}
/*在此单向循环链表的第 2 和第 3 个结点之间插入新的节点  (57,1972)*/
void Insert(DLinkList *head)
{
DLinkList newpoint={57,1972,0};
DLinkList *p,*q,*s=(DLinkList*)malloc(sizeof(DLinkList));
*s=newpoint;
p=head->next;
q=p->next;
s->next=q;
p->next=s;
return;
}

/*删除此双向链表的第 9 个结点*/
void Delete(DLinkList *head)
{
DLinkList *p;
for(int i=0;i<7;i++)
head=head->next;
p=head->next;
head->next=head->next->next;
free(p);
return;
}