双向链表

/*DuLinkList.c双链表相关操作*/

 

#include <stdio.h>
#include <malloc.h>
#define MAXNUM 1024
typedef  int ElemType;
typedef struct DuLNode{
 ElemType data;
 struct DuLNode *priv;
 struct DuLNode *next;
}DuLNode, *DuLinkList;

 

//创建一个空的双向链表
DuLinkList CreatDuList(void)
{
 DuLinkList list=(DuLinkList)malloc(sizeof(DuLNode));
 list->next=list->priv=list;
 return list;
 
}

 

int printDuLink(DuLinkList list)
{
   int nodenum=1;    //节点序号
   DuLinkList p=list->next;  //p指向第一个节点
   //当无头结点时使用LinkList p=list;
   if(p==list)
     return -1;
   while(p!=list)
  {
     printf("[%d]:%d/x20 ",nodenum,p->data);    //每个节点数据之间用空格隔开
     p=p->next;
     ++nodenum;
  }
  return 0;
}

 

/*在第i个位置插入结点1<=i<=表长+1
**Return: 0:成功
**   -1:失败 插入位置错误
*/
int DuListInsert(DuLinkList list,int i,ElemType data)
{
   DuLinkList pInsert;
   DuLinkList p=list;  //p指向链表的头结点
   int j=1;
   if(i<1)
     return -1;

 

  //先当找到地i-1个节点
  while(j<i)   {
    p=p->next;
    j++;
    if(p==list)    //到达文件头
      return -1; //i大于表长
  }
  
 //此时p指向第i-1个节点
 pInsert=(DuLinkList)malloc(sizeof(DuLNode)); //pInsert要插入的节点指针
 pInsert->data=data;
 pInsert->priv=p;
 pInsert->next=p->next;
 p->next->priv=pInsert->next;
 p->next=pInsert;
 return 0;
 
}

 

 

/*删除链表中第i个节点
**Return: 0:成功
**   -1:失败 删除位置错误
*/
int DuListDelete(DuLinkList list,int i,ElemType *e)
{
    int j=1; /* j为计数器 */
    DuLinkList p=list->next; /* p指向第一个结点 */
    while((p!=list)&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为头结点 */
    {
      p=p->next;
      j++;
    }
    if((p==list)||i<1) /* 第i个元素不存在 */
      return -1;

 *e=p->data;
 p->priv->next=p->next;
 p->next->priv=p->priv;
 free(p);
 return 0;
}


int main()
{
 int num,insertNum,deleteNum;
 ElemType insertData,e;
 DuLinkList newList;
 printf("1.创建一个空的双向链表/n");
 printf("2.向链表中插入结点(插入结点的位置>=1且<=表长+1)/n");
 printf("3.删除链表中某个节点(要删除的节点的位置>=1且<=表长)/n");
 printf("-------------------------/n");
 printf("请先创建一个双向链表/n");
 while(1)
 {
    printf("请选择操作:/n");
    scanf("%d",&num);
    switch(num)
   {
      case 1:
          newList=CreatDuList();
          printf("创建空链表成功/n");
          break;
     case 2:
          printf("请输入要插入节点的位置/n");
          scanf("%d",&insertNum);
          printf("请输入要插入的节点的数据/n");
          scanf("%d",&insertData);
         if(DuListInsert(newList,insertNum,insertData)==-1)
        {
             printf("你输入的位置<1或>表长+1/n");
             return -1;
        }
        if(printDuLink(newList))
        {printf("链表为空/n");
        break;}
     case 3:
        printf("请输入要删除节点的位置/n");
         scanf("%d",&deleteNum);
        if(DuListDelete(newList,deleteNum,&e))
      {
       printf("你输入的位置<1或>表长/n");
        return -1;
      }
      if(printDuLink(newList))
      {printf("链表为空/n");
      break;

      }
   default:
      printf("输入有误!/n");
   }
 }

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值