版权声明:欢迎朋友们的观摩,标注原创的文章,如应用,请标明出处,谢谢。 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;
}