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

链表

程序员文章站 2022-06-09 10:06:14
...
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int ElemType;
typedef struct Lnode
{
     ElemType data;
     struct Lnode *next;
}LNode;
LNode *L,*L1,*L2;
LNode *creat_L();
void out_L(LNode *L);
void insert_L(LNode *L,int i, ElemType e);
ElemType delete_L(LNode *L,int i);
int locat_L(LNode *L,ElemType e);
int length(LNode *L);
int alldelete(LNode *L,ElemType e);
int moredelete(LNode *L);
LNode *hebing(LNode *L1,LNode *L2);
void VisitList(LNode *Lc);
void FreeList(LNode *Lc);
int  main()
{
    int i,k,loc,len;
    ElemType e,x;
    char ch;
    do
	{
        printf("\n\n\n");
        printf("\n\n       1.建立线性链表");
        printf("\n\n       2.在i位置插入元素e");
        printf("\n\n       3.删除第i个元素,返回其值");
        printf("\n\n       4.查找值为e的元素");
        printf("\n\n       5.求链表长");
        printf("\n\n       6.删除单链表中值为x的所有结点");
        printf("\n\n       7.单链表去重");
        printf("\n\n       8.两个有序的单链表合并后仍然有序的单链表");
        printf("\n——————————");
        printf("\n      请输入您的选择(1,2,3,4,5,6,7,8)");
        scanf("%d",&k);
        switch(k)
        {
            case 1:
                {
                    L=creat_L();
                    out_L(L);
                }break;
            case 2:
                {
                    printf("\n i,e=?");
                    scanf("%d,%d",&i,&e);
                    insert_L(L,i,e);
                    out_L(L);
                }break;
            case 3:
                {
                   printf("\n i=?");
                   scanf("%d",&i);
                   x=delete_L(L,i);
                   out_L(L);
                   if(x!=-1)
                   printf("\n x=%d\n",x);
                }break;
            case 4:
                {
                    printf("\n e=?");
                    scanf("%d",&e);
                    loc=locat_L(L,e);
                    if(loc==-1)
                    printf("\n 未找到 %d",loc);
                    else
                    printf("\n 已找到,元素位置是 %d",loc);
                }break;
            case 5:
                {
                    len=length(L);
                    printf("%d",len);
                }break;
            case 6:
                {
                    scanf("%d",&e);
                    x=alldelete(L,e);
                    out_L(L);
                }break;
            case 7:
                {
                   moredelete(L);
                   out_L(L);
                }
            case 8:
                {
                   L1=creat_L();
                   L2=creat_L();
                   hebing(L1,L2);
                   out_L(L1);
                }break;

            }

            printf("\n-------------");
        }while(k>=1&&k<9);
        printf("\n           再见!");
        printf("\n      按enter键,返回");
        ch=getchar();
}
//建立线性链表(尾部插入结点建立单链表)
LNode *creat_L()
{
    LNode *h,*p,*s;
    ElemType x;
    h=(LNode *)malloc(sizeof(LNode));
    h->next=NULL;
    p=h;
    printf("\n data=?");
    scanf("%d",&x);
    while(x!=-111)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        s->next=NULL;
        p->next=s;
        p=s;
        printf("data=?(-111end)");
        scanf("%d",&x);
    }
    return(h);
}
void out_L(LNode *L)
{
    LNode *p;
    char ch;
    p=L->next;
    printf("\n\n");
    while(p!=NULL)
    {
        printf("%5d",p->data);
        p=p->next;
    };
    printf("\n\n按enter键,继续");
    ch=getchar();
}
void insert_L(LNode *L,int i, ElemType e)
{
    LNode *s,*p,*q;
    int j;
    p=L;
    j=0;
    while((p!=NULL)&&(j<i-1))
    {
        p=p->next;
        j++;
    }
    if(p==NULL||j>i-1)
    printf("\n i ERROR");
    else
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
    }
}
ElemType delete_L(LNode *L,int i)
{
    LNode *p,*q;
    int j;
    ElemType x;
    p=L;
    j=0;
    while(p->next!=NULL&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p->next==NULL)
    {
        printf("\n i ERROR");
        return(-1);
    }
    else
    {
        q=p->next;
        x=q->data;
        p->next=q->next;
        free(q);
        return(x);
    }
}
int locat_L(LNode *L,ElemType e)
{
    LNode *p;
    int j=1;
    p=L->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        j++;
    }
    if(p!=NULL) return(j);
    else        return(-1);
}
int length(LNode *L)
{
    LNode *p;
    int countt=0;
    p=L->next;
    while(p!=NULL)
    {
        countt++;
        p=p->next;
    }
    return(countt);
}
int alldelete(LNode *L,ElemType e)
{
    LNode *p,*q;
    p=L;
    q=L->next;
    while(q!=NULL)
    {
        if(q->data==e)
        {
            p->next=q->next;
            free(q);
            q=p->next;

        }
        else
        {
            p=q;
            q=q->next;
        }
    }
}
int moredelete(LNode *L)
{
    LNode *p,*q,*str;
    p=L->next;
    while(p!=NULL)
    {
        q=p,str=p->next;
        while (str!=NULL)
        {
            if (str->data==p->data)
            {
                q->next=str->next;
                free(str);
                str=q->next;
            }
            else
            {
                q=str;
                str=str->next;
            }
        }
        p=p->next ;
    }
}
LNode *hebing(LNode *L1,LNode *L2)
{
	LNode *Lt,*pa,*pb,*pc,*ptr;
	Lt=L1;  
 	pc=L1;    
	pa=L1->next;  
	pb=L2->next;
 	while(pa!=NULL&& pb!=NULL)
 	{  
	 	if(pa->data<pb->data)
    	{   
			pc->next=pa;  
			pc=pa;   
			pa=pa->next;   
		}
		else if(pa->data>pb->data)
    	{   
			pc->next=pb;  
			pc=pb;   
			pb=pb->next;   
		}
		else if(pa->data==pb->data)
    	{   
			pc->next=pa;  
			pc=pa;   
			pa=pa->next; 
         	ptr=pb; 
		    pb=pb->next; 
			free(ptr);   
		}
	}
 	if(pa!=NULL)  
 		pc->next=pa;
	else   
		pc->next=pb ;    
//	free(L2) ;
	
}
/*void VisitList(LNode *L)
{  
    if(L)  
    {  
    	
        VisitList(L->next);  
    }  
    else  
    {  
    	printf("null");
    }  
}*/ 
/*void FreeList(LNode *L)
{  
    if(L==NULL)  
    {  
        return ;  
    }  
    else  
    {  
        LNode *temp=L->next;  
        delete L;  
        Lc=temp;  
        FreeList(L);  
    }  
} 
*/

相关标签: 2018