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

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

#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("\n");
}//显示链表
int main()
{
mylist sxlist=init();
int n,j;
printf("输入n\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\n");
scanf("%d",&n);
while(n)
{
printf("输入j\n");
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);

显示链表就没问题。

(黑人问号?????)

猜你喜欢

转载自www.cnblogs.com/zwjj/p/9769882.html