双向链表的小练习

版权声明:欢迎朋友们的观摩,标注原创的文章,如应用,请标明出处,谢谢。 https://blog.csdn.net/qq_37012770/article/details/78117722

双向链表的小练习

用双向链表生成二十六个字母,然后,有用户输入一个数,无论正负,然后改表将向前移动该数的距离位置。

#include <stdio.h>
#include <stdlib.h>

#define OK      1
#define ERROR   0

typedef char ElemType;
typedef int  Status;

typedef struct DualNode
{
    ElemType data;
    struct DualNode *prior;
    struct DualNode *next;

}DualNode, *DuLinkList;


/*创建函数,返回一个状态码,OK表示1,ERROR表示0*/
Status InitList(DuLinkList *L)
{
    DualNode *p,*q;//创建两个临时的指针,q是当前最新生成的节点,p是移动的当前节点
    int i;

    *L = (DuLinkList)malloc(sizeof(DualNode));
    if( !(*L))//如果申请空间失败,则返回ERROR 
    {
        return ERROR; 
    }

    (*L)->next = (*L)->prior = NULL;//创建初期的头结点的前指针和后指针都是空的,什么也不指向。
    p = (*L);//将临时指向的指针赋值为p,p这是就暂时停留在头结点的上空 

    /*要开始循环创建双向链表了*/ 
    for(i = 0;i<26;i++)
    {
        q = (DualNode *)malloc(sizeof(DualNode));//每一个循环开始的时候,都会为当前的指针节点分配空间
        if(!q)
        {
            return ERROR;
        }

        q->data = 'A'+i;//单引号的内容是A,快看不见了 
        q->prior = p;
        q->next = p->next;//p->是为空的,所以这一步就是将p的后续节点指向空置。 
        p->next = q;
        p = q;

    } //创建完毕 
    //下面两句就将创建好的线性双向表连接起来,循环起来 
    p->next = (*L)->next;
    (*L)->next->prior = p;

    return OK; 

}


void Decide(DuLinkList *L,int i)
{
    if( i>0 ){
        do{
            (*L) = (*L)->next;
          }
        while(--i);
    }
        if( i<0 ){
            do{
                (*L) = (*L)->next;
              }
            while(++i);
        }
 } 





int main()
{
    DuLinkList L;//只有在主函数中创建的表头 
    int i,n;

    InitList(&L);//不要忘了,实参传地址的时候,不能用*,而是用& 

    printf("请输入一个整数n,\n您将要求该链表内容向前走n个单位:\n");
    scanf("%d",&n);
    Decide(&L,n);
    for(i = 0;i<26;i++){
    /*在函数中实现的指针操作,是不会因为传不回地址而不可调用的。
    只要是地址操作,不论返回与否,都可直接调用*/ 
        L = L->next;//L原指头结点,L->next就是第一个节点,然后赋值给当前变量L 
        printf("%c ", L->data);
    }

    printf("\n");




    return 0;
}






猜你喜欢

转载自blog.csdn.net/qq_37012770/article/details/78117722