线性表基本操作和简单程序——c语言

 分别以头插法和尾插法建立两个数据域定义为整型的升序单链表,再将这两个有序链表合并成一个新的无重复元素的有序链表,最后可以根据输入的数据,先找到相应的结点,后删除之。


#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    int  data;
    struct node *next;
}node;

node * qbuild(node *first)     //头插法
{
	int i,n,a[100];
	node *s;
	printf("输入n:");
	scanf("%d",&n);
	first=(node*)malloc(sizeof(node));
	first->next=NULL;
	for(i=0;i<n;i++)
	{
		s=(node*)malloc(sizeof(node));
		printf("输入a[%d]:",i);
	    scanf("%d",&a[i]);
        s->data=a[i];
		s->next=first->next;
		first->next=s;
	}	
	return first;
}

   
node * hbuild(node *first)         //尾插发
{
	int i,n,a[100];
	struct node *s,*r;
	printf("输入n:");
	scanf("%d",&n);
	first=(node*)malloc(sizeof(node));
	r=first;
	for(i=0;i<n;i++)
	{
	
		s=(node*)malloc(sizeof(node));
        printf("输入a[%d]:",i);
	    scanf("%d",&a[i]);
		s->data=a[i];
		r->next=s;
        r=s;
	}
	r->next=NULL;
	return first; 

}
 
node * hebing(node *La,node *Lb)         // 将两个有序链表合并
{
	node *pa,*pb,*pc,*Lc;
	pa=La->next;
	pb=Lb->next;
	Lc=pc=La;
	while(pa && pb)
	{
		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{
            pc->next =pa;
			pc=pa;
			pa=pa->next ;
			pb=pb->next ;
		}
		
	}
	pc->next =pa?pa:pb;
	free(Lb);
    return Lc;
}

node * shanchu(node *first,int i)          //删除一个链表中的一个字符
{
    node *p,*q;
	p=first->next;
	while(p)
    {
		if((p->next )->data==i)
		{
		   q=p->next  ;
		   p->next =q->next;
		   free(q);
		   break;
		}
		   p=p->next;
	}
	return first;
}

void display(node *first)
{
	struct node *p;
	p=first->next;
	while(p!=NULL)
    {
		printf("%d ",p->data);
		p=p->next;
	
	}
    printf("\n");
}

int main()                           //主函数
{   
	int m;
	struct node *a,*b,*c;
    a=qbuild(a);
    printf("打印链表a:");
    display(a);
    
		
    b=hbuild(b);
    printf("打印链表b:");
    display(b);
   
    c=hebing(a,b);
    printf("打印链表c:");
	display(c);

	printf("输入删除的数m:");
	scanf("%d",&m);
	c=shanchu(c,m);
	printf("打印删除后的链表c:");
	display(c);

    return 0;
}
输入输出实例;

输入n:5
输入a[0]:9
输入a[1]:5
输入a[2]:4
输入a[3]:3
输入a[4]:1
打印链表a:1 3 4 5 9
输入n:5
输入a[0]:1
输入a[1]:3
输入a[2]:4
输入a[3]:6
输入a[4]:8
打印链表b:1 3 4 6 8
打印链表c:1 3 4 5 6 8 9
输入删除的数m:5
打印删除后的链表c:1 3 4 6 8 9


--------------------------------
Process exited after 32.78 seconds with return value 0
请按任意键继续. . .





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值