//编程建立双链表
//不带头结点的双链表
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
int data;
struct student *next;
struct student *pre;
} DNode;
DNode *head, *p, *s;
DNode *create()
{
int x, cycle=1;
head=(DNode *)malloc(sizeof(DNode));
p=head; //如果换成带头节点的链表。这里也不能变,切记,不能变成p=head->next;那就错了
printf("\nplease input the data:\n");
while(cycle)
{
scanf("%d",&x);
if(x!=0)
{
s=(DNode *)malloc(sizeof(DNode));
s->data=x;
// printf("\n %d", s->data);
p->next=s;
s->pre=p;
p=s;
}
else
{
cycle=0;
}
}
p->next=NULL; // 终结操作
head=head->next;// 后移操作
head->pre=NULL;// 删除头节点的操作
return head;
}
void Delete(int pos){
DNode *p2,*p2L,*p2R, *p3;
p2=head;
p3=head;
for(int i=1;i<pos;i++){
p2=p2->next;
}
p2L=p2->pre; //前面的节点
p2R=p2->next;//后面的节点
p2L->next=p2->next;
p2L=p2R->pre;
//开始输出
printf("\nnow out put the double linklist:\n");
while(p3!=NULL)
{
printf("%3d", p3->data);
p3=p3->next;
}
printf("\n");
}
//返回head给p
int main()
{
int flag;
DNode *p1;
p1=create(); //如果是带头节点链表,需要在这句话之后加一句p=p->next;保证从head的下一个节点输出数据,因为数据本身就是head的下一个
//节点开始存储的,
printf("\nnow out put the double linklist:\n");
while(p1!=NULL)
{
printf("%3d", p1->data);
p1=p1->next;
}
printf("\n");
system("pause");
Delete(3);
return 0;
}
尾插法建立双向链表,无头点
最新推荐文章于 2023-12-20 13:35:53 发布