链表

#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);  
    }  
} 
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值