1.(顺序表)编写一个程序,其功能是:从顺序表的第i个位置开始,删除k个元素,并输出删除前后的元素。
实现代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define FALSE 0
#define OK 1
typedef int ElemType;//顺序表中存放整形元素
typedef struct
{
ElemType elem[MAXSIZE];
int last;
}SeqList;
int main()
{
//初始化
int i=0,k;
SeqList L;
L.last=0;
printf("请输入整数,作为顺序表的元素,以回车键隔开,不要超过20个:\n");
while(scanf("%d",&L.elem[i])!=0)
{
i++;
L.last++;
if(i>=MAXSIZE)
break;
}
//显示用户输入的顺序表
printf("\n现在,您输入的顺序表为:");
for(i=0;i<L.last;i++)
{
printf("%d ",L.elem[i]);
}
//输入i,k的值
printf("\n请输入您要开始删除的第i个位置:");
getchar();
scanf("%d",&i);
printf("\n您要删除多少个数:");
getchar();
scanf("%d",&k);
//调用删除函数
DelList(&L,i,k);
//输出删除后的顺序表
printf("\n删除后的顺序表为:");
for(i=0;i<L.last;i++)
{
printf("%d ",L.elem[i]);
}
return 0;
}
//删除操作函数
int DelList(SeqList *L,int i,int k)
{
//合法性判断
if(i>L->last||(i+k)>L->last)
return(FALSE);
//删除操作
int m,n;
for(m=0;m<k;m++)
{
for(n=i-1;n<=L->last;n++)
{
L->elem[n]=L->elem[n+1];
}
L->last--;
}
return(OK);
}
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,*LinkList;
int Deal(LinkList *LA,int n);
int main()
{
//建立单链表,并初始化
LinkList * LA = NULL;
*LA=(LinkList)malloc(sizeof(Node));
(*LA)->next=NULL;
//尾插法建表
Node *r,*s;
int c;
r=*LA;
int flag=1,count=0;
while(flag)
{
printf("Please input new node to the LinkList,node must be intatger,input q to quit:\n");
scanf("%d",&c);
if(c!='q')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
count++;
}
else
{
flag=0;
r->next=NULL;
}
}
//调用函数
Deal(LA,count);
//打印新生成的表
printf("New LinkList is:\n");
r=(*LA)->next;
while(r->next!=NULL)
{
printf("%5d",r->data);
}
return 0;
}
int Deal(LinkList *LA,int n)//n为单链表长度,n为偶数
{
LinkList *LB,*LC;
*LB=(LinkList)malloc(sizeof(Node));//建立头结点
(*LB)->next=NULL;//建立空的单链表LB
*LC=(LinkList)malloc(sizeof(Node));//建立头结点
(*LC)->next=NULL;//建立空的单链表LC
Node *p,*q,*r,*s;
int i;
p=(*LA)->next->next;//令指针p指向序号为偶数的元素
q=(*LA)->next;//令指针q指向序号为奇数的元素
r=*LB; //令指针r指向LB
s=*LC;//令指针s指向LC
//插入LB的第一个元素
(*LB)->next=p;
q->next=p->next;
p=p->next->next;
while(p->next!=NULL&&q->next!=NULL)
{
//尾插法
s->next=q;
*LA=q->next;
q=q->next->next;
s=s->next;
//头插法
p->next=(*LB)->next;
(*LB)->next=p;
p=p->next->next;
}
//合并LB/LC两表
if(p->next==NULL)
{
p->next=(*LC)->next;
free(LC);
}
return 0;
}