C 语言 数据结构之双向链表

来源:互联网 发布:mac os x 10.11 dmg 编辑:程序博客网 时间:2024/04/27 01:42

双向链表的空间结构如下图所示:


#include <stdio.h>

#include <stdlib.h>


struct Node
{
  char data;
  struct Node *left;
  struct Node *right;
};


typedef struct Node DListNode;
typedef struct Node *DLinkList;


int InitDList(DLinkList *head);
int CreateDList(DLinkList head,int n);
void PrintDList(DLinkList head);
DListNode *GetElem(DLinkList head,int i);
int InsertDList(DLinkList head,int i,char e);


int main(void)
{
    DLinkList h;
int n;  //链表元素个数
char e;
int pos;
    InitDList(&h);
printf("输入元素个数:");
scanf("%d",&n);
    getchar();
    CreateDList(h,n);
printf("链表中的元素:");
PrintDList(h);
printf("请输入插入的元素及位置:");
scanf("%c",&e);
getchar();
scanf("%d",&pos);
    InsertDList(h,pos,e);
printf("插入新元素后的链表中的元素:");
    PrintDList(h);
return 0;
}


int InitDList(DLinkList *head) //初始化双向循环链表
{
   *head=(DLinkList)malloc(sizeof(DListNode));
   (*head)->left=*head;
   (*head)->right=*head;
   return 1;
}


int CreateDList(DLinkList head,int n)  //创建双向循环链表
{
   DListNode *p,*q;
    int i;
char e;
    q=head;
    for(i=1;i<=n;i++)
    {
printf("输入第%d个元素:",i);
        e=getchar();
        p=(DListNode*)malloc(sizeof(DListNode));
p->data=e;
/*将新生成的结点插入到双向循环链表*/
        p->right=q->right;
        q->right=p;
        p->left=q;
        head->left=p; /*这里要注意头结点的left指向新插入的结点*/
        q=p; /*q始终指向最后一个结点*/
getchar();
}
return 1;
}


void PrintDList(DLinkList head)//输出双向循环链表中的每一个元素
{
    DListNode *p;
    p=head->right;
    while(p!=head)
    {
        printf("%c",p->data);
        p=p->right;
    }
printf("\n");
}


DListNode *GetElem(DLinkList head,int i)//查找插入的位置,返回结点的指针,否则返回NULL
{
   DListNode *p;
   int j;
   p=head->right;
   j=1;
   while(p!=head && j<i)
   {
  p=p->right;
  j++;
   }
   if(p==head || j>i)
  return NULL;
   return p;
}


int InsertDList(DLinkList head,int i,char e) //在双向循环链表的第i个位置插入元素e
{
   DListNode *p,*s;
   p=GetElem(head,i);
   if(!p)
  return -1;
   s=(DListNode*)malloc(sizeof(DListNode));
   s->data=e;
   s->left=p->left;
   p->left->right=s;
   s->right=p;
   p->left=s;
   return 1;
}
0 0