双向链表的插入(及其疑问)
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);
显示链表就没问题。
(黑人问号?????)
以上是关于双向链表的插入(及其疑问)的主要内容,如果未能解决你的问题,请参考以下文章