双向链表基本操作

 
//带头节点的双向链表操作
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define  OK 1
#define  ERROR 0
#define  OVERFLOW 0
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct DuLNode
{
    int  data;
    struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;

void InitList(DuLinkList L)
{                               //产生空的双向循环链表L
		L = (DuLinkList)malloc(sizeof(DuLNode));
	if(L)
		L->next = L->prior = L;
	else
		exit(0);
}

DuLinkList CreateList()  
{  
    int i, length = 0,data;  
    DuLinkList pTail = NULL, p_new = NULL;  
    DuLinkList head = (DuLinkList)malloc(sizeof(DuLinkList));  
     
    if (NULL == head)  
    {  
        printf("内存分配失败!\n");  
        exit(EXIT_FAILURE);  
    }   
    head->prior = NULL;  
    head->next = NULL;  
    pTail = head;  
    printf("请输入想要创建链表的长度:");  
    scanf("%d",&length);  
    for(i=1; i<=length; i++)  
    {  
        p_new = (DuLinkList)malloc(sizeof(DuLinkList));    
        if (NULL == p_new)  
        {  
            printf("内存分配失败!\n");  
            exit(EXIT_FAILURE);  
        }  
  
        printf("请输入第%d个元素的值:", i);  
        scanf("%d", &data);  
        p_new->data = data;  
        p_new->next = NULL;  
        p_new->prior = pTail;  
        pTail->next = p_new;  
        pTail = p_new;  
    }  
    return head;  
} 
 
int ListLength(DuLinkList L)
{
	int i = 0;
	DuLinkList p = L;           // p指向第一个结点
	while(p->next) 		  	   //p没到表头
	{
	    i++;
	    p = p->next;
	}
    return i;
}

DuLinkList GetElemP(DuLinkList L,int i) 
{    /* 在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,*/

    int j;
    DuLinkList p = L;      /* p指向头结点 */
    if(i<0||i>ListLength(L)) /* i值不合法 */
          return NULL;
    for(j=1;j<=i;j++)
          p = p->next;
    return p;
}

Status ListInsert(DuLinkList L,int i,ElemType e)
{ 
						     
    DuLinkList p,s;
    if(i<1||i>=ListLength(L)+1)          // i值不合法
       	return ERROR;
       	p = GetElemP(L,i-1);          //在L中确定第i个元素前驱的位置指针p
    if(!p) 					         // p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱)
       	return ERROR;
		s = (DuLinkList)malloc(sizeof(DuLNode));
	if(!s)
		return OVERFLOW;
		s->data = e;
		s->prior = p;          //先连接前部        
		s->next = p->next;    //连接后部 
		p->next->prior = s;
		p->next = s;  
		return OK;

}

DuLinkList ListDelete(DuLinkList L,int i)
{        
    int l = ListLength(L) ;                     // 删除带头结点的双链循环线性表L的第i个元素,i的合法值为(1<=i<=表长)
    DuLinkList p,pp;
    if(i<1||i>l){
    	printf("删除失败-----\n");
    	exit(0);
	}  
	    p = GetElemP(L,i);                   // 在L中确定第i个元素的位置指针p
	    if(!p->next){
			p->prior->next = NULL;
			free(p);
	    } 
	    else{                            //p=NULL,即第i个元素不存在
	                                              
			p->prior->next = p->next;
			p->next->prior = p->prior;
			free(p);
	    }
	return  L;
}

void PrintList(DuLinkList L){
    DuLinkList p = L->next;
    while(p){
      printf("%d ",p->data);
      p = p->next;
    }
}

int main(){
	    DuLinkList p,pp;
	    InitList(p); 
        p = CreateList();
		PrintList(p);                     //打印原始创建链表  
/*测试添加*/	
		printf("-------\n");
	    printf("输入你要插入的位置及元素:\n") ; 
	    int weizhi,num;
	    scanf("%d%d",&weizhi,&num);
        int k  = ListInsert(p,weizhi,num); 
	    if(k){
	   	    PrintList(p);  
	    } 
        else{
         	printf("NO!\n");
		}

/*测试删除*/ 
        printf("输入你要删除的位置:\n") ; 
	    int weizhi2;
	    scanf("%d",&weizhi2);
		pp = ListDelete(p, weizhi2);
		PrintList(pp);	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值