欢迎加qq群:453398542 学习讨论,会定期分享资料课程,解答问题。
(2)单链表的操作
① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 在该单链表的第i个元素前插入一个整数。
④ 删除该单链表中的第i个元素,其值通过参数将其返回。
⑤ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L){
//建链表
LinkList p,pre;
int x;
L=pre=(LinkList)malloc(sizeof(LNode));
scanf("%d",&x);
while(x>0){
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
pre->next=p;
pre=p;
scanf("%d",&x);
}
pre->next=NULL;
}
void Output(LinkList L){
//遍历
LinkList p;
p=L->next;//临时指针指向首结点的地址
while(p!=NULL)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
void GetElem(LinkList L,int i,int &e){
//查找 i为链表长度
LinkList p;
int j;
p=L->next; j=1;
while(p&&j<i){
p=p->next; j++;
}
if(!p||j>i)
return;
e=p->data;
}
void ListInsert(LinkList &L,int i,int e){
//插入 i为插入位置
LNode *p,*s;
int j;
p=L; j=0;
while(p&&j<i-1){
p=p->next; j++;
}
if(!p||j>i-1){
return;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
void ListDelete(LinkList &L,int i,int &e){
//删除
LinkList p,q;
int j=0;
p=L;
while(p->next&&j<i-1){
p=p->next; j++;
}
if(!p->next||j>i-1){
return;
}
q=p->next;
e=q->data;
p->next=q->next;
free(q);
}
void Merge(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);
}
void Reverse(LinkList &L){
//就地逆置
LinkList p,q;
p = L->next;
L->next = NULL;
while(p != NULL){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
int main(){
LinkList La,Lb,Lc;
int i,e,j,k;
InitList(La);
printf("输入要插入的位置和数:");
scanf("%d%d",&i,&e);
ListInsert(La,i,e);
Output(La);
printf("要删除第几个数:");
scanf("%d",&j);
ListDelete(La,j,k);
printf("删除的数为:%d\n",k);
Output(La);
printf("再建立一个;\n");
InitList(Lb);
Merge(La,Lb,Lc);
Reverse(Lc);
Output(Lc);
}