数据结构与算法之单链表

单链表

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int  Elemtype;
typedef struct LNode  
{
	Elemtype date;
	struct LNode *next;		
} LinkNode;	
				
void CreateListF(LinkNode *&L,Elemtype a[],int n)    //头插法建立单链表
{
	LinkNode *s;int i; 
	L=(LinkNode *)malloc(sizeof(LinkNode));  	
	L->next=NULL;
	for (i=0;i<n;i++)
	{	
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->date=a[i];
		s->next=L->next;			
		L->next=s;
	}
}

void InitList(LinkNode *&L)
{
	L=(LinkNode *)malloc(sizeof(LinkNode));  	//初始化单链表 
	L->next=NULL;
}

void DestroyList(LinkNode *&L)       //释放单链表      
{
	LinkNode *pre=L,*p=pre->next;
	while (p!=NULL)
	{	free(pre);
		pre=p;
		p=pre->next;
	}
	free(pre);	
}

bool ListEmpty(LinkNode *L)  //判空 
{
	return(L->next==NULL);
}

int ListLength(LinkNode *L)  //求链表的长度 
{
	LinkNode *p=L;int i=0;
	while (p->next!=NULL)
	{	i++;
		p=p->next;
	}
	return(i);
}

void DispList(LinkNode *L)  //输出链表         
{
	LinkNode *p=L->next;
	while (p!=NULL)
	{	printf("%d ",p->date);
		p=p->next;
	}
	printf("\n");
}

void UnionList1(LinkNode*LA,LinkNode*LB,LinkNode *&LC) //单链表二路归并算法 
{
	LinkNode *pa=LA->next,*pb=LB->next,*r,*s;
	LC=(LinkNode *)malloc(sizeof(LinkNode));
	r=LC;
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->data<pb->data)
		{
			s=(LinkNode *)malloc(sizeof(LinkNode));
			s->data=pa->data;
			r->next=s;
			r=s;
			pa=pa->next;
		}
		else
		{
			s=(LinkNode*)malloc(sizeof(LinkNode));
			s->data=pb->data;
			r->next=s;
			r=s;
			pb=pb->next;
		}
	}
	while(pa!=NULL)
	{
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->data=pa->data;
		r->next=s;
		r=s;
		pa=pa->next;
	}
	while(pb!=NULL)
	{
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->data=pb->data;
		r->next=s;r=s;
		pb=pb->next;
	}
	r->next=NULL;
} 
bool ListInsert(LinkNode *&L,int i,Elemtype e)  //插入元素 
{
	int j=0;
	LinkNode *p=L,*s;
	if (i<=0) return false;			
	while (j<i-1 && p!=NULL)		
	{	j++;
		p=p->next;
	}
	if (p==NULL)					
		return false;
	else							
	{	s=(LinkNode *)malloc(sizeof(LinkNode));
		s->date=e;
		s->next=p->next;			
		p->next=s;
		return true;
	}
}

bool ListDelete(LinkNode *&L,int i,Elemtype &e)//删除元素 
{
	int j=0;
	LinkNode *p=L,*q;
	if (i<=0) return false;		
	while (j<i-1 && p!=NULL)	
	{	j++;
		p=p->next;
	}
	if (p==NULL)			
		return false;
	else					
	{	q=p->next;				
		if (q==NULL) 
			return false;	
		e=q->date;
		p->next=q->next;		
		free(q);				
		return true;
	}
}

int main()
{
    LinkNode *LA;
    LinkNode *LB;
    LinkNode *LC;
    Elemtype a[MaxSize];
    Elemtype b[MaxSize];
    int n1; //第一个多项式位数 
    printf("请输入n1多项式的系数个数:");
    scanf("%d",&n1);
	printf("请输入n1多项式的系数") 
	for(int i=0;i<n1;i++)      //创建多项式n1
	{
		scanf("%d",a[i]);
		
    } 
	int n2; //第二个多项式位数 
    printf("请输入n2多项式的系数个数:");
    scanf("%d",&n2);
	printf("请输入n2多项式的系数") 
	for(int i=0;i<n2;i++)      //创建多项式n2 
	{
		scanf("%d",b[i]);
		
    }           
    Elemtype e;
    InitList(LA);             //初始化链表
	InitList(LB);
    printf("初始化完成\n");
   
    
    CreateListF(L,a,5);                  //依次插入a,b,c,d,e
    printf("头插入元素后输出的链表为:\n");

    DispList(LA);                        //输出链表LA
  
    DispList(LB);                        //输出链表LB
  
  

    DestroyList(LA);//释放链表LA
	DestroyList(LB);//释放链表LB  
	DestroyList(LC);//释放链表LC                     
    printf("释放全部链表");
    return 0;
}
posted @ 2019-10-06 22:09  AmosAlbert  阅读(68)  评论(0编辑  收藏  举报