【数据结构】单链表的一些实用操作

   本人为数据结构初学者,以下是在学习中总结的一些关于单链表的操作。希望大家多多指教。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
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;
}
void InitList(LinkList *L)          //初始化链表
{
 *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;
 }
}
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;
}
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;
 }
}
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);
}
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;
 }
}
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;}
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值