本人为数据结构初学者,以下是在学习中总结的一些关于单链表的操作。希望大家多多指教。
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct tagLNODE{
ElemType data;
struct tagLNODE *next;
}LNODE,*LinkList; //设计结点
typedef struct tagLNODE{
ElemType data;
struct tagLNODE *next;
}LNODE,*LinkList; //设计结点
void CreateLinkR(LinkList *L,int n) //构建单链表
{
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNODE));
for(;n>0;n--){
s=(LinkList)malloc(sizeof(LNODE));
scanf("%d",&s->data);
p->next=s,p=s;
}
p->next=NULL;
}
{
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNODE));
for(;n>0;n--){
s=(LinkList)malloc(sizeof(LNODE));
scanf("%d",&s->data);
p->next=s,p=s;
}
p->next=NULL;
}
void InitList(LinkList *L) //初始化链表
{
*L=(LinkList)malloc(sizeof(LNODE));
(*L)->next=NULL;
{
*L=(LinkList)malloc(sizeof(LNODE));
(*L)->next=NULL;
}
void DisplayLink(LinkList L) //打印单链表
{
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
{
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
void insert_order(LinkList L,int x)//按从小到大的顺序插入链表
{
LinkList p,q;
p=L;
while(p->next!=NULL&&p->next->data<x)
p=p->next;
q=(LinkList)malloc(sizeof(LNODE));
q->data=x;
q->next=p->next;
p->next=q;
}
{
LinkList p,q;
p=L;
while(p->next!=NULL&&p->next->data<x)
p=p->next;
q=(LinkList)malloc(sizeof(LNODE));
q->data=x;
q->next=p->next;
p->next=q;
}
void reverse(LinkList L) //链表的逆置
{
LinkList p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
{
LinkList p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
void Merge_Link(LinkList L1,LinkList L2,LinkList L3) //两个有序表按顺序归并
{
LinkList p1,p2,p3;
p1=L1->next,p2=L2->next;
p3=L3;
while(p1&&p2){
if(p1->data<=p2->data){
p3->next=p1;p3=p1;p1=p1->next;
}
else{p3->next=p2;p3=p2;p2=p2->next;}
}
p3->next=p1?p1:p2;
free(L2);
}
{
LinkList p1,p2,p3;
p1=L1->next,p2=L2->next;
p3=L3;
while(p1&&p2){
if(p1->data<=p2->data){
p3->next=p1;p3=p1;p1=p1->next;
}
else{p3->next=p2;p3=p2;p2=p2->next;}
}
p3->next=p1?p1:p2;
free(L2);
}
void deleteNode(LinkList L1,LinkList L2) //删除两个链表(L1)中相同值的节点
{
LinkList p1,p2,q;
p1=L1;
p2=L2;
while((p2->next)!=NULL){
while((p1->next)!=NULL){
if((p1->next)->data==(p2->next)->data){
q=p1->next;
p1->next=q->next;
free(q);
p1=p1->next;
}
else {p1=p1->next;}
}
p1=L1;
p2=p2->next;
}
}
{
LinkList p1,p2,q;
p1=L1;
p2=L2;
while((p2->next)!=NULL){
while((p1->next)!=NULL){
if((p1->next)->data==(p2->next)->data){
q=p1->next;
p1->next=q->next;
free(q);
p1=p1->next;
}
else {p1=p1->next;}
}
p1=L1;
p2=p2->next;
}
}
void search_same(LinkList L1,LinkList L2,LinkList L3) //输出两个链表中相同值的节点
{
LinkList p1,p2,p3;
p1=L1->next;
p2=L2->next;
p3=L3;
while(p1&&p2){
if(p1->data<p2->data) p1=p1->next;
else if(p1->data>p2->data) p2=p2->next;
else{insert_order(L3,p1->data);p1=p1->next;p2=p2->next;}
}
}
{
LinkList p1,p2,p3;
p1=L1->next;
p2=L2->next;
p3=L3;
while(p1&&p2){
if(p1->data<p2->data) p1=p1->next;
else if(p1->data>p2->data) p2=p2->next;
else{insert_order(L3,p1->data);p1=p1->next;p2=p2->next;}
}
}