双链表构建和使用(考研王道)

#include<stdio.h>
#include<stdlib.h>
//带头结点的双链表 
typedef struct Node{
	int data;
	struct Node* prior;
	struct Node* next;
	
}Node,*DLinkList;

//头插法创建双链表
DLinkList Head_List(DLinkList &L){
	Node* s=NULL;
	L=(DLinkList)malloc(sizeof(Node));
	L->next=NULL;
	L->prior=NULL; 
	int x,j=1;
	printf("请输入第%d个节点:\n",j);
	scanf("%d",&x);
	while(x!=999){
		s=(Node*)malloc(sizeof(Node));
		s->data=x;
        s->next = L->next;    
        if(L->next != NULL){
            L->next->prior = s;
        }
        L->next = s;     
        s->prior = L;
		j++;
		printf("请输入第%d个节点:\n",j);
		scanf("%d",&x);	
	}
	return L;
}

//尾插法构建双链表

DLinkList Tail_List(DLinkList &L){
	Node* s=NULL;
	L=(DLinkList)malloc(sizeof(Node));
	int x,j=1;
	L->next=NULL;
	L->prior=NULL;
	Node* r=L;//尾指针
	printf("请建立第%d个节点,值为:\n",j);
	scanf("%d",&x);
	while(x!=999){
		s=(Node*)malloc(sizeof(Node));
		s->data=x;
		s->prior=r;
		r->next=s;
		s->next=NULL;
		r=s;
		j++;
		printf("请输入第%d个节点:\n",j);
		scanf("%d",&x);			
	}
	return L;
}


//按序号查找节点的值 
Node *GettElem(DLinkList L,int i){
	 int j=1;
	 Node*p =L->next;
	 while(i==0){
	 	return L;
	 }
	 if(i<1) return NULL;
	 while(p && j<i){
	 	p=p->next;
	 	j++;
	 }
	 return p;	
}

//按序号删除节点
Node * DeleElem(DLinkList &L,int i){
	if(i<1 || i==0) return NULL;
	Node* p=GettElem(L,i-1);
	Node* q=(Node*)malloc(sizeof(Node));
	q=p->next;
	p->next=q->next;
	q->next->prior=p;
	free(q);
	return L;
} 

//输出双链表数据元素
void PrintList(DLinkList& L) {
	printf("输出单链表数据元素为:\n");
	DLinkList p = L->next;	//定义一个结点指针p指向头结点的下一个结点
	while (p)		//如果p不为空则循环
	{
		printf("%d\t", p->data);		//输出
		p = p->next;			//移动指针p遍历链表
	}
	printf("\n");
}

int main(){
	DLinkList L;   //声明一个指向单链表的指针
	Tail_List(L);		//尾插法创建单链表
//	Node*tmp=GettElem(L,3);
	Node*tmp=DeleElem(L,3);
//	printf("%d",tmp->data);
	PrintList(tmp);		//输出单链表数据元素
	return 0;
}

版权声明:本文为qq_44762267原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。