欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

双向链表基本操作

程序员文章站 2024-03-22 11:24:58
...
 
//带头节点的双向链表操作
#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;
}

相关标签: 双向链表