您的位置:首页 > 其它

带头结点的尾插法建立双链表

2011-12-20 20:52 281 查看
带头结点和不带头结点的尾插法建立双链表

一.带头结点的

先介绍存储数据类型为字符型的

view
plainprint?

//编程建立双链表(data为字符型数据)13-2-1ex3.cpp

//带头结点的双链表

#include<stdio.h>

#include<stdlib.h>

//#include<string.h>

//#include<conio.h>

//#define E_DEBUG

#ifdef E_DEBUG

#define PRINT printf

#else

#define PRINT(...) do{}while(0)

#endif

typedef char datatype;

typedef struct student

{

datatype data;

struct student *next;

struct student *pre;

}DNode;

DNode *create()

{

DNode *head, *p, *s;

datatype x, cycle=1;

head=(DNode *)malloc(sizeof(DNode));

p=head; //如果换成带头节点的链表。这里也不能变,切记,不能变成p=head->next;那就错了

printf("\nplease input the data:\n");

while(cycle)

{

scanf("%c",&x); //见后面注意2)

if(x!='#')

{

s=(DNode *)malloc(sizeof(DNode));

s->data=x;

PRINT("\n %c", s->data);

p->next=s;

s->pre=p;

p=s;

}

else

{

cycle=0;

}

}

p->next=NULL;

///head=head->next;//注意,这两句是不带头结点的双链表必须做的,因为按照算法。输入的第一个数实际上是赋值给了head->next

//head->pre=NULL;//所以,这就相当于头结点(head)里面没有值,所以要用这两步将head向后移一位,之前那个head就不要了。

PRINT("\nhead->data:%c\n",head->data);

return head;

}

int main()

{

DNode *p;

p=create();

p=p->next; //如果是带头节点的双链表建立,除了少了上面那个函数的末尾的步之外,多了这一步,保证从head的下一个节点输出链表data。

printf("\nnow out put the double linklist:\n");

while(p!=NULL)

{

printf("%3c", p->data);

p=p->next;

}

printf("\n");

system("pause");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐