单链表的操作
① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 在该单链表的第i个元素前插入一个整数。
④ 删除该单链表中的第i个元素,其值通过参数将其返回。
⑤ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 5
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList &L,int n){ //创建链表
LinkList pre,p;
L=(LinkList)malloc(sizeof(LinkList)); //头节点
pre=L;
for(int i=0;i<MAX;i++){
p=(LinkList)malloc(sizeof(LinkList));
scanf("%d",&(p->data));
pre->next=p;
pre=p;
}
pre->next = NULL;
}
void Output(LinkList &L){
LinkList p;
p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
}
void AddElem(LinkList &L,int i,int e){//增加元素
LinkList p,Newp;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p || j>i-1)
exit(0);
Newp=(LinkList)malloc(sizeof(LinkList));
Newp->data=e;
Newp->next=p->next;
p->next=Newp;
}
int DelateElem(LinkList &L,int i,int e){//删除元素
LinkList p,q;
p=L;int j=0;
while(p->next&&j<i-1){
p=p->next;++j;
}
if(!(p->next) || j>i-1)
exit(0);
q=p->next;p->next=q->next;e=q->data;free(q);
return e;
}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) //合并
{
LinkList pa,pb,pc;
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{
pc->next=pb;pc=pb;pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
int main(void){
LinkList Linka,Linkb,Linkc;
int e;
printf("输入两组递增的整数\n");
CreateList(Linka);
Output(Linka);//输出新建的链表
AddElem(Linka,1,2);
Output(Linka);//输出添加元素后的链表
DelateElem(Linka,2,e);
Output(Linka);
CreateList(Linkb);
MergeList(Linka,Linkb,Linkc);
Output(Linkc);
return 0;
}