1、单链表的合并
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
LinkList CreateLink();
void Display(LinkList L);
LinkList Merge(LinkList La,LinkList Lb);
int main(){
LinkList La,Lb,Lc;
InitList(&La);InitList(&Lb);
La=CreateLink();
Lb=CreateLink();
Display(La);Display(Lb);
Lc=Merge(La,Lb);
printf("The new result is :");
Display(Lc);
return 0;
}
void InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));
if(*L==NULL)
exit(-1);
(*L)->next=NULL;
}
//头插法
LinkList CreateLink(){
LinkList L,p,s;
int n;
printf("Please enter the length of the list:");
scanf("%d",&n);
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=L;
printf("Please enter the list:");
for(int i=0;i<n;i++){
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
s->next=p->next;
p->next=s;
p=s;
}
return L;
}
void Display(LinkList L){
LinkList p;
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
LinkList Merge(LinkList La,LinkList Lb){
LinkList pa,pb,pc;
LinkList Lc;
Lc=(LinkList)malloc(sizeof(LNode));
pa=La->next;
pb=Lb->next;
pc=Lc;
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);
free(La);
return Lc;
}
2、单链表-删除重复节点
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
LinkList CreateLink();
void Display(LinkList L);
LinkList Delete_value(LinkList L);
int main(){
LinkList La;
InitList(&La);
La=CreateLink();
Display(La);
La=Delete_value(La);
printf("The new result is :");
Display(La);
return 0;
}
void InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));
if(*L==NULL)
exit(-1);
(*L)->next=NULL;
}
//头插法
LinkList CreateLink(){
LinkList L,p,s;
int n;
printf("Please enter the length of the list:");
scanf("%d",&n);
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=L;
printf("Please enter the list:");
for(int i=0;i<n;i++){
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
s->next=p->next;
p->next=s;
p=s;
}
return L;
}
void Display(LinkList L){
LinkList p;
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
LinkList Delete_value(LinkList L){
LinkList p,q,s;
p=L->next;
while(p!=NULL){
q=p;
while(q->next!=NULL){
if(q->next->data==p->data){
s=q->next;
q->next=s->next;
free(s);
}
else
q=q->next;
}
p=p->next;
}
return L;
}
3、单链表-一元多项式的表示与相加
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct LNode{
float coef;//系数
int expn;//指数
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
LinkList CreateList();
void Display(LinkList L);
LinkList AddPoly(LinkList La,LinkList Lb);
int main(void){
LinkList La,Lb,Lc;
InitList(&La);InitList(&Lb);InitList(&Lc);
La=CreateList();
Display(La);
printf("\n");
Lb=CreateList();
Display(Lb);
printf("\n");
Lc=AddPoly(La,Lb);
Display(Lc);
return 0;
}
void InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));
if(*L==NULL)
exit(-1);
(*L)->next=NULL;
}
LinkList CreateList(){
LinkList L,p,s;
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(-1);
L->coef=0;L->expn=0;L->next=NULL;
p=L;
int n;float c;int e;
printf("请输入项数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
s=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d个元素的系数和指数:",i+1);
scanf("%f %d",&c,&e);
s->coef=c;
s->expn=e;
s->next=p->next;
p->next=s;
p=s;
}
return L;
}
void Display(LinkList L){
LinkList p=L->next;
printf("P(x) = ");
while(p!=NULL){
printf("%0.1f",p->coef);
if(p->expn)
printf("*x^%d",p->expn);
if(p->next&&p->next->coef>0)
printf("+");
p=p->next;
}
}
//两个多项式相加
LinkList AddPoly(LinkList La,LinkList Lb){
LinkList Lc,pa,pb,pc,s,p;
Lc=(LinkList)malloc(sizeof(LNode));
Lc->next=NULL;
pa=La->next;
pb=Lb->next;
pc=Lc;
while(pa&&pb){
if(pa->expn<pb->expn){
s=(LinkList)malloc(sizeof(LNode));
s->coef=pa->coef;
s->expn=pa->expn;
s->next=NULL;
pc->next=s;
pc=s;
pa=pa->next;
}
else if(pa->expn>pb->expn){
s=(LinkList)malloc(sizeof(LNode));
s->coef=pb->coef;
s->expn=pb->expn;
s->next=NULL;
pc->next=s;
pc=s;
pb=pb->next;
}
else{
if(pa->coef+pb->coef!=0){
s=(LinkList)malloc(sizeof(LNode));
s->coef=pa->coef+pb->coef;
s->expn=pa->expn;
s->next=NULL;
pc->next=s;
pc=s;
}
pa=pa->next;pb=pb->next;
}
}
p=pa?pa:pb;
while(p){
s=(LinkList)malloc(sizeof(LNode));
s->coef=p->coef;
s->expn=p->expn;
s->next=NULL;
pc->next=s;
pc=s;
p=p->next;
}
pc->next=NULL;
return Lc;
}
4、单循环链表的合并
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
LinkList CreateList();
Status DestroyLisy(LinkList *L);
void Display(LinkList L);
LinkList Merge(LinkList La,LinkList Lb);
int main(){
LinkList La,Lb;
InitList(&La);InitList(&Lb);
La=CreateList();
Lb=CreateList();
Display(La);Display(Lb);
La=Merge(La,Lb);
Display(La);
return 0;
}
void InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));
if(*L==NULL)
exit(-1);
(*L)->next=*L;
}
//头插法
LinkList CreateList(){
LinkList L,p,s;
int n;
printf("Please enter the length of the list:");
scanf("%d",&n);
L=(LinkList)malloc(sizeof(LNode));
L->next=L;
p=L;
printf("Please enter the list:");
for(int i=0;i<n;i++){
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
s->next=p->next;
p->next=s;
p=s;
}
return L;
}
void Display(LinkList L){
LinkList p;
p=L->next;
while(p!=L){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//合并,只需修改尾指针
LinkList Merge(LinkList La,LinkList Lb){
LinkList p,q;
p=La;q=Lb;
while(p->next!=La)
p=p->next;
while(q->next!=Lb)
q=q->next;
p->next=Lb->next;
q->next=La;
return La;
}