7-1 单链表基本操作 (5 分)

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:

输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。

输出格式:

输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。

输入样例:

5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0 
1 6

输出样例:

7 1 2 8 3 5 
#include<stdio.h>
typedef struct Node
{
    int data;
    struct Node*next;
}node;
node* head=NULL;
node* rear;
void insertend(node* temp)
{
    if(head==NULL)
    {
        head=temp;
        rear=temp;
        rear->next=NULL;
    }
    else
    {
        rear->next=temp;
        rear=temp;
        rear->next=NULL;
    }
}
void insert(node*temp,int k,int d)
{
    if(k==0)
    {
        temp->data=d;
        temp->next=head;
        head=temp;
    }
    else
    {
        node* p0=head;
        while(k-1>0)
        {
            p0=p0->next;
            k--;
        }
        temp->next=p0->next;
        p0->next=temp;
        temp->data=d;
    }
}
void delete(int k)
{
    node* p=head;
    int nm=1;
    while(p!=NULL&&nm<k-1)
    {
        p=p->next;
        nm++;
    }
    node*q=p;p=p->next;
    if(p->next!=NULL)
    {
        q->next=p->next;
        free(p);
    }
    else
    {
        q->next=NULL;
        free(p);
    }
}
int main()
{
    int n,i;
    int num;
    node*p;
    int m;
    scanf("%d",&n);
    for(i=0;i<n;i++) 
    {
        node*n=(node*)malloc(sizeof(struct Node));
        insertend(n);
    }
    p=head; 
    while(p!=NULL)
    {
        scanf("%d",&num);
        p->data=num;
        p=p->next;
    }
    scanf("%d",&m);
    int n1,n2,n3;
    for(i=0;i<m;i++)
    {
    	scanf("%d",&n1);
    	if(n1==0)
		{
			scanf("%d",&n2);
            scanf("%d",&n3);
			if(n2>=0&&n2<=n)
            {
			    node*temp=(node*)malloc(sizeof(struct Node));
			    insert(temp,n2,n3);
			    n++;
            }
		}
		if(n1==1)
		{
			scanf("%d",&n2);
			if(n2>0&&n2<=n)
			{
				delete(n2);
				n--;
			}
		}
	}
	p=head;
	while(p!=NULL)
    {
	    printf("%d ",p->data);
	    p=p->next;
    }
    printf("\n");
    return 0;
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值