数据结构C语言实现顺序链表基本操作(插入,排序,合并)

#include<stdio.h>
#include<stdlib.h>


#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct LNode{
 ElemType data;
 struct LNode *next;
}LNode,*LinkList;

void CreatList(LinkList &L) //尾插入法
{
 LinkList p,q;
 int i,n;
 printf("请输入数据的个数\n");
 scanf("%d",&n);
 L=(LinkList)malloc(sizeof(LNode));
 L->next=NULL;
 q=L;
 printf("请输入%d个数据\n",n);
 for(i=0;i<n;i++)
 {
  p=(LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  q->next=p;
  q=q->next;
 }
 p->next=NULL;
}

void CreatList2(LinkList &L) //头插入法
{
 LinkList p,q;
 int i,n;
 printf("请输入数据的个数\n");
 scanf("%d",&n);
 L=(LinkList)malloc(sizeof(LNode));
 L->next=NULL;
 q=L;
 printf("请输入%d个数据\n",n);
 for(i=0;i<n;i++)
 {
  p=(LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  p->next=q->next;
  q->next=p;
 } 
 }

void PrintList(LinkList &L) //链表输出
{
 LinkList p;
 p=L->next;
 printf("链表中的数据为\n");
 while(p)
 {
  printf("%d\t",p->data);
  p=p->next;
 }
  }
int ListLength(LinkList L)
{
 LinkList p;
 int n=0;
 p=L->next;
 while(p)
 {
  n++;
  p=p->next;
 }
 return n;
}


Status ListInsert(LinkList L,int n,ElemType e) //元素插入
{
 int i;
 LinkList p,q;
 p=(LinkList)malloc(sizeof(LNode));
 p->data=e;
 q=L;
 for(i=0;i<n-1;i++)
 {
  q=q->next;
 }
 p->next=q->next;
 q->next=p;
 return OK;
}


Status DeletList(LinkList L,int n,ElemType &e) //元素删除
{
 int i;
 LinkList p,q;
 q=p=L;
 for(i=0;i<n-1;i++)
 {
  p=p->next;
  q=q->next;
 }
 q=q->next;
 e=q->data;
 p->next=q->next;
}


Status SortList(LinkList &L) //交换结点
{
    LinkList r,q,p,end,temp;
    end=NULL;
    while(L -> next != end)
    {
     r=L;
  q=r->next;
  p=q->next;
        while(p!=end)
        {
            if(q->data>p->data)
            {
                q -> next = p -> next;
                r -> next = p;
                p -> next = q;
                temp = p;
                p = q;
                q = temp;
            }
            r=r->next;
   q=q->next;
   p=p->next;
        }
        end =q;
    }
    return OK;
}


Status SortList2(LinkList &L) //交换数据
{
 LinkList p,q,end;
 int t,n=0,i,j;
 end=NULL;
 p=L->next;
 q=p->next;
 while(L->next!=end)
 {
  p=L->next;
     q=p->next;
    while(q!=end)
    {
      if(p->data>q->data)
      {
       t=p->data;
       p->data=q->data;
       q->data=t;
  }
  p=p->next;
  q=q->next;
    }
    end=p;
   }
 return OK;
 }
 
  void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) //合并链表
 { 
  LinkList r,q,p;
  q=La->next;
  p=Lb->next;
  r=Lc=La;
  while(q!=NULL&&p!=NULL)
  {
   if(q->data<p->data)
   {
    r->next=q;
    r=r->next;
    q=q->next;
   }
   else
   {
    r->next=p;
    r=r->next;
    p=p->next;
   }
 }
 if(q!=NULL)
  r->next=q;
  else
  r->next=p;
 }

int main()
{
 int  n;
 ElemType e;
 LinkList La,Lb,Lc;
 printf("创建链表La\n");
 CreatList(La);
 PrintList(La);
 n=ListLength(La);
 printf("\n该链表的长度为 %d\n",n);
 printf("请输入需要插入的位置和数据\n");
 scanf("%d %d",&n,&e);
 ListInsert(La,n,e);
 PrintList(La);
 printf("\n请输入需要删除数据的位置\n");
 scanf("%d",&n);
 DeletList(La,n,e);
 PrintList(La);
 printf("\n被删除的数据为 ");
 printf("\n%d\n",e);
 if(SortList(La)!=1)
 printf("排序错误");
 printf("排序后\n");
 PrintList(La);
    printf("\n创建链表Lb");
 CreatList(Lb);
 if(SortList(Lb)!=1)
 printf("排序错误");
 printf("排序后\n");
 PrintList(Lb);
 MergeList(La,Lb,Lc);
 printf("\n将链表La和Lb合并为Lc\n");
 PrintList(Lc);
 printf("\n\n\t                               杨佳宁创作");
 return 0;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值