双向循环链表基本操作

#include
#include


typedef struct dlnode //typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。
{
char data;
struct dlnode *prior,*next;//声明头指针,尾指针 

} DLNode;


DLNode *CreateDlinklist() //创建一个循环链表 
{
DLNode *q,*head;
char x;
head=(DLNode*)malloc(sizeof(DLNode));
head->prior = head;
head->next = head;
printf("输入数据:");
scanf("%c",&x);
while(x!='\n') //头插法 
{
q=(DLNode*)malloc(sizeof(DLNode));//申请存储新结点的存储空间 
q->data = x;   //将读入的数据存入q 
q->prior = head; // 新插入的结点其前驱是head 
q->next = head->next;//q的后继结点是原来的head的后继结点
head->next->prior = q;//头结点的原后继结点的前驱结点现在为q 
head->next = q;//头结点的现在后继结点  这里不能把这一句放在最前面,会造成原来链表的数据丢失 
scanf("%c",&x);

}
return head; //返回头指针 
}


DLNode *Get_Dlinklist(DLNode *head,int i)//查找结点 
{
DLNode *p = head;
int j = 0;
while(p->next!=head&&i!= j)//按序号查找结点 
{
p = p->next;
j++;
}
if(p->next!=head)
 return p;//找到此节点就返回指向这个节点的指针 
else
 return NULL; //否则返回空 



DLNode *Insert_Dlinklist(DLNode *head ,int i,char x)//在i位置上插入数值为x  
{
DLNode *p ,*s;
p = Get_Dlinklist(head,i-1);//查找i-1的结点
if(p==NULL)
printf("第%d个节点不存在,非法操作!\n",i-1);
else
{
s=(DLNode*)malloc(sizeof(DLNode));//申请一个存储空间存储s 
s->data = x; 
s->prior = p;//新节点s的 前驱结点为p 
s->next = p->next; //插入后s的后继结点现在为原结点的后继结点 
p->next->prior = s;//原节点 的后继结点的前驱结点现在为s 
p->next =s ; //p的后继结点为s 
}
}
void Del_DLinklist(DLNode *head,int i) //从第I个位置删除结点 
{
DLNode *p;
p=Get_Dlinklist(head,i);
if(p==NULL)
{
printf("第i个数据不存在!\n",i);
}
else
{
p->prior->next = p->next; //p结点的前驱结点的后继结点为p结点的后继结点 
p->next->prior = p->prior;//p节点的后继结点的前驱结点p结点的后继结点 
free(p);//释放所占的空间  很重要 
}



void Print(DLNode *h)//后项输出 
{
DLNode * p;
p = h->next;
while(p!=h)
{
printf("%c",p->data);
p = p->next;
}
printf("\n");



void Print2(DLNode *h)//前向输出 
{

DLNode * p;
p = h->prior;
while(p!=h)
{
printf("%c",p->data);
p = p->prior;
}
printf("\n");
}


int main()
{
DLNode *h,*p;
int i;
char x;
h = CreateDlinklist();
printf("前向输出双向链表:");
Print(h);
printf("后向输出双向链表:");
Print2(h);
printf("输入要查找元素的序号:");
scanf("%d",&i);
p = Get_Dlinklist(h,i) ;
if(p!= NULL)
    printf("查找的元素为%c:",p->data);
else
      printf("查找不到\n");
    printf("\n");
    printf("插入元素,输入要插入的位置以及元素值:");
    scanf("%d,%c",&i,&x);
    Insert_Dlinklist(h ,i,x);
    printf("前向输出双向链表:");
Print(h);
    printf("后向输出双向链表:");
Print2(h);
printf("删除元素,输入要删除的位置 :");
scanf("%d",&i);
Del_DLinklist(h,i) ;
Insert_Dlinklist(h ,i,x);
    printf("前向输出双向链表:");
Print(h);
    printf("后向输出双向链表:");
Print2(h);
return 0;

你可能感兴趣的:(数据结构)