数据结构--单链表

#include"stdio.h"  
#include"stdlib.h" 

typedef struct LNode
{
	int data;
	struct LNode *next;
}Lnode;
//尾插法建立单链表
void createListR(LNode *&C,int a[],int n)
{
	LNode *s,*r;//s指向新申请的节点,r指向C的终端节点
	C=(LNode *)malloc(sizeof(LNode));//申请头结点
	C->next=NULL;
	r=C;
	int i;
	for(i=0;i<n;i++)
	{	
		s=(LNode *)malloc(sizeof(LNode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
//头插法
void createListL(LNode *&C,int a[],int n){
	LNode *s;
	C=(LNode *)malloc(sizeof(LNode));//申请头结点
	C->next=NULL;
	int i;
	for(i=0;i<n;i++){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=a[i];
		//头插法关键2步,
		s->next=C->next;
		C->next=s;
	}
}
//归并2个递增的单链表成一个非递减有序的单链表C
void merge(LNode *A,LNode *B,LNode *&C){
	LNode *p=A->next;
	LNode *q=B->next;
	LNode *r;	//始终指向C的尾节点

	C=A;	//将A的头结点来做C的头结点
	C->next=NULL;

	free(B);
	r=C;
	while(p!=NULL&&q!=NULL){
		if(p->data<=q->data)
		{
			r->next=p;
			p=p->next;
			r=r->next;
		}
		else{
			r->next=q;
			q=q->next;
			r=r->next;
		}
		r->next=NULL;	//可以不写,下2个if语句必执行一个
		if(p!=NULL)	r->next=p;
		if(q!=NULL)	r->next=q;
	}
}
//删除单链表中元素x
void deleteNode(LNode *&L,int x)
{
	LNode *p,*pre;                  				 //pre为前驱结点,p为查找的结点。 
    p = L;
	pre=L;
    while(p->data != x)              			 //查找值为x的元素 
    {   
        pre = p; 
        p = p->next;
    }
    pre->next = p->next;          				 //删除操作,将其前驱next指向其后继。 
    free(p);

}
//查找x并删除
int findanddelete(LNode *&L,int x)
{
	LNode *p,*q;                  				 //p为前驱结点,q为查找的结点。 
    p = L;
    while(p->next!=NULL)              			 //查找值为x的元素 
    {   
        if(p->next->data==x)
			break;
        p = p->next;
    }
	//查找部分结束
	if(p->next==NULL)
		return 0;
	else
	{	
		//删除操作,
		q=p->next;
		p->next=q->next;	//将其前驱P的next指向其后继q的next
		free(q);	
		return 1;
	}

}
//在第i个位置插入元素
void insertList(LNode *&L,int i,int x)
{
	LNode *pre;                      				 //pre为前驱结点 
    pre = L;
    int tempi = 0;
    for (tempi = 1; tempi < i; tempi++)
        pre = pre->next;                			 //查找第i个位置的前驱结点 
    LNode *p;                               			  //插入的结点为p
    p = (LNode *)malloc(sizeof(LNode)); 
    p->data = x; 
    p->next = pre->next;
    pre->next = p;
        
}
//输出单链表
void printList(LNode *L)
{	
	LNode *p=L;

	while(!p->next==NULL)
	{
		p=p->next;
		printf("%d ",p->data);
	
	}
	printf("\n");
}

int main()
{	
	LNode *listA,*listB,*listC;
	int a[]={0,1,2,4,5,7,8,9};
	int b[]={3,6,10,15,17};
	//根据a,b数组建立2个单链表
	createListR(listA,a,8);
	createListR(listB,b,5);
	//打印单链表
	printf("单链表A:");
	printList(listA);
	printf("\n单链表B:");
	printList(listB);
	//归并单链表并打印
	merge(listA,listB,listC);
	printf("\n合并后单链表C:");
	printList(listC);
	
	//删除元素x并打印
	//deleteNode(listC,0);
	findanddelete(listC,0);
	printf("\n删除单链表C中元素:");
	printList(listC);

	//插入元素9
	insertList(listC,1,9);
	printf("\n单链表C中插入元素:");
	printList(listC);
	return 0;

}

猜你喜欢

转载自blog.csdn.net/huanniangyuan5422/article/details/80862680