双向链表的插入(及其疑问)

Posted zwjj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向链表的插入(及其疑问)相关的知识,希望对你有一定的参考价值。

本人刚学,有很多问题,希望大家帮忙指出,谢谢

 

#include<stdio.h>
#include<stdlib.h>
#define datatype int

typedef struct node
{
datatype data;
struct node *prev;
struct node *next;
}listnode,*mylist;

//双向链表的初始化

mylist init(void)
{
mylist list=(mylist )malloc(sizeof(listnode));//分配内存
if(list!=NULL)
list->prev=list->next=list;//定义双向循环链表
return list;
}

mylist node(datatype data)
{
mylist newnode=(mylist)malloc(sizeof(listnode));
if(newnode!=NULL)
{
newnode->data=data;
newnode->prev=NULL;
newnode->next=NULL;
}
return newnode;
}//创建新节点
void insert(mylist new1,mylist list)
{
if(new1==NULL || list==NULL)
{
return ;
}
new1->prev=list;
new1->next=list->next;
list->next=new1;
list->next->prev=new1;
printf("----insert");
}//将new1节点插入list节点后面(后插)
void show(mylist list)
{
mylist tmp=list->next;
while(tmp != list)
{
printf("%d",tmp->data);
tmp=tmp->next;
}
printf(" ");
}//显示链表
int main()
{
mylist sxlist=init();
int n,j;
printf("输入n ");
scanf("%d",&n);
for(j=1;j<n;j++)
{
mylist Newnode=node(j);
insert(Newnode,sxlist);
}
show(sxlist);
while(1);
return 0;
}

1、按照这个方式是可以插入并显示的

技术分享图片

2、可是把for循环改成for(j=n;j<1;j--)
{
mylist Newnode=node(j);
insert(Newnode,sxlist);
}就不行啦,不知道为什么。

3、如果把main函数换成

int main()
{
mylist sxlist=init();
int n,j;
printf("输入n ");
scanf("%d",&n);
while(n)
{
printf("输入j ");
scanf("%d",&j);
mylist Newnode=node(j);
insert(Newnode,sxlist);
printf("%d",sxlist->data);
sxlist=sxlist->next;
n--;
}
show(sxlist);
return 0;
}技术分享图片

第一个节点就会显示不正常。

4、在三的基础上改显示代码

 printf("%d",tmp->next->data);

显示链表就没问题。

技术分享图片

(黑人问号?????)



















































































以上是关于双向链表的插入(及其疑问)的主要内容,如果未能解决你的问题,请参考以下文章

单向链表和双向链表的原理及其相关实现

数据结构之带头结点的循环双向链表详细图片+文字讲解

❤️数据结构入门❤️(1 - 4)- 双向链表

双向链表的建立插入删除

数据结构(链表——双向链表的实现)

c语言 双向链表的简单操作-创建插入删除