代码功能:实现链表插入与删除的基本功能
http://www.bnuoj.com/contest/problem_show.php?pid=4101
线性表插入与删除操作
Input
第一行给出线性表内现有数据元素的数目N,1<=N<=10;第二行给出N个整数:a1、a2、a3…aN,整数之间用一个空格隔开,表示线性表现有的数据元素。第三行给出两个整数K、E1,1<=K<=N,表示在第K个元素前插入值为E1的数据元素;第四行给出一个整数E2,表示在线性表中删除第一个值为E2的数据元素(假定线性表里一定存在值为E2的数据元素)。
Output
在一行内按次序输出进行插入和删除后线性表的所有数据元素,数据元素之间用一个空格隔开。
Sample Input
8 12 13 21 24 28 30 42 77 5 25 24
Sample Output
12 13 21 25 28 30 42 77
AC代码:
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int date;
struct Node *next;
}Node,*LinkList;
void CreateList(LinkList &pa,int n) //创建链表
{
LinkList p,q;
//p=(LinkList)malloc(sizeof(Node));
p=pa;
int i,a;
for(i=0;i<n;++i)
{
q=(LinkList)malloc(sizeof(Node));
scanf("%d",&(q->date));
p->next=q;
q->next=NULL;
p=q;
}
}
void print(LinkList &pa,int n) //输出链表 pa为头结点,n个有效节点
{
int i;
LinkList p=pa->next;
printf("%d",p->date);
for(i=2;i<=n;++i)
{
p=p->next;
printf(" %d",p->date);
}
printf("\n");
}
bool DeleteList(LinkList &pa,int m,int &n) //删除数据域为m的节点
{
LinkList p=pa,q=NULL;
int j=1;
while(p&&j<=n)
{
if(p->next->date==m)
{ q=p->next;
p->next=p->next->next;
free(q);n--;
//printf("%d#\n",n);
return true;
}
j++;
p=p->next;
}
return false;
}
bool InsertList(LinkList &pa,int k,int E1,int &n) //k前在插入节点(数据域为E1)
{
LinkList p=pa,s;
int j=0; //j=0可是空链表中插入元素
while(p->next&&j<=k-1)
{
if(j==k-1)
{
s=(LinkList)malloc(sizeof(Node));
s->date=E1;
s->next=p->next;
p->next=s;
n++;
return true;
}
j++;
p=p->next;
}
return false;
}
int main()
{
LinkList L,p; //L为头指针
L=(LinkList)malloc(sizeof(Node));
int N,i,K,E1,E2;
while(~scanf("%d",&N)){
CreateList(L,N);
scanf("%d%d",&K,&E1);
InsertList(L,K,E1,N);
scanf("%d",&E2);
DeleteList(L,E2,N);
print(L,N);
}
//while(1);
return 0;
}