① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 实现单链表的就地逆置。
④ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间,并且新表中没有相同的元素。
/*(2)单链表的操作
① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 实现单链表的就地逆置。
④ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间,并且新表中没有相同的元素。
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
LNode *next;
}*List,LNode;
void InitLinkList(List &L){
L=(List)malloc(sizeof(struct LNode));
if(!L) return;
L->next=NULL;
}//初始化
void CreateLinkList_Tail(List &L,int n){
L=(List)malloc(sizeof(struct LNode));
List pre=L;
printf("请输入一组(5个)整型元素:");
for(int i=0;i<n;i++){
List p=(List)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
pre->next=p;
pre=p;
}
pre->next=NULL;
}//尾插
void bianli(List L){
List p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}//遍历
void nizhi(List &L){
List p=L->next;
L->next=NULL;
while(p){
List q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}//逆置
void delet(List &L1){
List p=L1->next;
while(p->next!=NULL){
if(p->data == p->next->data){
List s=p->next;
p->next=s->next;
free(s);
}
else {
p=p->next;
}
}
}//删除重复
void hebing(List &L1,List L2){
List p1=L1->next;
List p2=L2->next;
List pre1=L1;
//List pre2=L2->next;
while(p1 && p2){
if(p1->data < p2->data){
pre1->next=p1;
pre1=p1;
p1=p1->next;
}
else {
pre1->next=p2;
pre1=pre1->next;
p2=p2->next;
}
}
if(p1) pre1->next=p1;
if(p2) pre1->next=p2;
free(L2);
delet(L1);//删除重复
nizhi(L1);//逆置
}
//合并
int main(){
List L;
List L1,L2;
InitLinkList(L); //初始化
CreateLinkList_Tail(L,5);//插入5个元素
printf("遍历:");
bianli(L);//遍历
printf("逆置:");
nizhi(L);//逆置
bianli(L);//遍历检测是否逆置成功
InitLinkList(L1); //初始化L1
CreateLinkList_Tail(L1,5);//L1插入5个元素
InitLinkList(L2); //初始化L2
CreateLinkList_Tail(L2,5);//L2插入5个元素
printf("合并成按值递增有序列表:");
hebing(L1,L2);
bianli(L1);//遍历
//delet(L1);
//bianli(L1);//遍历
//nizhi(L1);
//bianli(L1);//遍历
}
运行截图