线性链表---数据结构

#include <string.h>
#include <conio.h>
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;

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


Status CreateList_L(LinkList &L);           //建立空列表的函数的声明
Status OutputData_L(LinkList L);            //输出数据的函数声明
Status LinkList_L(LinkList &L);       //插入元素的函数
Status ListDelete_L(LinkList &L);         //删除元素的函数声明
Status MergeList_L();                //顺序表的合并函数的声明

 

//主函数进行操作
int main()
{
 LinkList T;
 
 
 printf("1.输入数据 2.输出数据 3.插入数据 4.删除数据  5.归并顺序列表  6.退出程序/n");;
    int num;
 while(1)                        //无限循环
 {
  printf("请选择操作:");
  scanf("%d",&num);
  switch(num)
  {
  case 1:CreateList_L(T);break;
  case 2:OutputData_L(T);break;
  case 3:LinkList_L(T);break;
  case 4:ListDelete_L(T);break;
  case 5:MergeList_L();break;
  case 6:exit(0);break;
  }
 }
 return 0;

  }

 

//插入元素的函数
Status LinkList_L(LinkList &L)
{
 int i,j;
 ElemType e;
 LNode *p,*s;
 printf("请输入插入的位置i和元素e:");
 scanf("%d",&i);
 scanf("%d",&e);
 p=L.head;
 j=0;
 while(p&&j<i-1)
 {
  p=p->next;
  ++j;
 }
 if(!p||j>i-1)  return ERROR;

 s=(LNode *)malloc(sizeof(LNode));         
 s->data=e;
 s->next=p->next;
 p->next=s;
 printf("/n");
 return OK;
}

 

//删除元素的函数
Status ListDelete_L(LinkList &L)
{
 int i,j;
 ElemType e;
 LNode *p,*q;
 printf("请选择插删除的位置i:");
 scanf("%d",&i);
 p=L.head;
 for(j=0;j<i-1;j++)
 {
  p=p->next;
 }
 
 q=p->next;
 p->next=q->next;      //q->next->next   指向后一个
 e=q->data;         //(q->data)=e
 free(q);
 OutputData_L(L);
 return OK;
}


//输出数据的函数
Status OutputData_L(LinkList L)
{
 LNode *p;
 p=L.head;        //L的定义在创建链表中   是指基址

 printf("输出数据为:");
 do
 {
  p=p->next;
  printf("%d ",p->data);
  
 }while(p->next);
 printf("/n/n");
 return OK;
}
  

Status CreateList_L(LinkList &L)
{
 int n;
 printf("请输入元素总个数n:");
 scanf("%d",&n);

 LNode *p,*q;

 L.head=(LNode *)malloc(sizeof(LNode));
 L.head->next=NULL;
 p=L.head;

 ElemType *s;
 s=new ElemType[n];
 printf("请输入%d个数:",n);
    for(int i=0;i<n;i++)
 {
  scanf("%d",&s[i]);
  q=(LNode *)malloc(sizeof(LNode));
  q->data=s[i];
  q->next=p->next;
  p->next=q;
  p=p->next;
 }
 delete s;


    printf("/n");
 return OK;
}

 

//以下为归并的部分
CreateList_Lc(LinkList &L)
{
 L.head=(LNode *)malloc(sizeof(LNode));
 L.head->next=NULL;

 return OK;
}

Status MergeList_L()
{
 LinkList La,Lb,Lc;
 LNode *pa,*pb,*pc;
   
 system("cls");
 printf("创建非递减排列顺序表a:/n");
 CreateList_L(La);
    printf("创建非递减排列顺序表b:/n");
    CreateList_L(Lb);
 CreateList_Lc(Lc);


 pa=La.head->next;
 pb=Lb.head ->next;
 Lc.head=pc=La.head;          //用pa的头结点做pc的头结点---实现方法很有研究,相当于pc=La.head;Lc.head=pc;两步。

 
 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.head);

 printf("/n合并顺序表a,b后顺序表c如下:/n");
    OutputData_L(Lc);
 return 0;
}

/*终于搞出来了,别笑,这对我确实不容易的。*/
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值