#include<stdio.h>
#include<stdlib.h>
//带头结点的双链表
typedef struct Node{
int data;
struct Node* prior;
struct Node* next;
}Node,*DLinkList;
//头插法创建双链表
DLinkList Head_List(DLinkList &L){
Node* s=NULL;
L=(DLinkList)malloc(sizeof(Node));
L->next=NULL;
L->prior=NULL;
int x,j=1;
printf("请输入第%d个节点:\n",j);
scanf("%d",&x);
while(x!=999){
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->next = L->next;
if(L->next != NULL){
L->next->prior = s;
}
L->next = s;
s->prior = L;
j++;
printf("请输入第%d个节点:\n",j);
scanf("%d",&x);
}
return L;
}
//尾插法构建双链表
DLinkList Tail_List(DLinkList &L){
Node* s=NULL;
L=(DLinkList)malloc(sizeof(Node));
int x,j=1;
L->next=NULL;
L->prior=NULL;
Node* r=L;//尾指针
printf("请建立第%d个节点,值为:\n",j);
scanf("%d",&x);
while(x!=999){
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->prior=r;
r->next=s;
s->next=NULL;
r=s;
j++;
printf("请输入第%d个节点:\n",j);
scanf("%d",&x);
}
return L;
}
//按序号查找节点的值
Node *GettElem(DLinkList L,int i){
int j=1;
Node*p =L->next;
while(i==0){
return L;
}
if(i<1) return NULL;
while(p && j<i){
p=p->next;
j++;
}
return p;
}
//按序号删除节点
Node * DeleElem(DLinkList &L,int i){
if(i<1 || i==0) return NULL;
Node* p=GettElem(L,i-1);
Node* q=(Node*)malloc(sizeof(Node));
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
return L;
}
//输出双链表数据元素
void PrintList(DLinkList& L) {
printf("输出单链表数据元素为:\n");
DLinkList p = L->next; //定义一个结点指针p指向头结点的下一个结点
while (p) //如果p不为空则循环
{
printf("%d\t", p->data); //输出
p = p->next; //移动指针p遍历链表
}
printf("\n");
}
int main(){
DLinkList L; //声明一个指向单链表的指针
Tail_List(L); //尾插法创建单链表
// Node*tmp=GettElem(L,3);
Node*tmp=DeleElem(L,3);
// printf("%d",tmp->data);
PrintList(tmp); //输出单链表数据元素
return 0;
}
版权声明:本文为qq_44762267原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。