带头结点和不带头结点的尾插法建立双链表
一.带头结点的
先介绍存储数据类型为字符型的
- //编程建立双链表(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;
- }