双向链表的小练习

来源:互联网 发布:所有香烟条形码数据库 编辑:程序博客网 时间:2024/06/16 15:02

双向链表的小练习

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

#include <stdio.h>#include <stdlib.h>#define OK      1#define ERROR   0typedef 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;}
原创粉丝点击