表的链式表示与实现

1.头文件head.h
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define  FALSE 0
typedef struct linknode{
       int data;
       struct linknode *next;
}Lnode,*LinkList;
void InitList1(Lnode *L)//单链表的初始化
{
       L=(Lnode *)malloc(sizeof(Lnode));
       L->next=NULL;
}
void InitList2(Lnode *&L)//单链表的初始化
{
       L=(Lnode *)malloc(sizeof(Lnode));
       L->next=NULL;
       printf("请输入元素个数:");
       int n;
       scanf("%d",&n);    
       Lnode *q;
       q=L;
       printf("请输入元素序列:");
       for(int i=0;i<n;i++)
       {
              Lnode *p=(Lnode *)malloc(sizeof(Lnode));
              p->next=NULL;
              scanf("%d",&p->data);  
              q->next=p;
              q=p;
       }
}
int Length(Lnode *L)//返回单链表的长度
{
       int i=0;//计数器
       Lnode *p=L->next;
       while(p!=NULL)
       {
              i++;
              p=p->next;
       }
       return i;
}
void PrintList(Lnode *L)//输出单链表中的元素
{
       Lnode *p;
       p=L->next;
       printf("单链表中元素为:");
       while(p!=NULL)
       {
              printf("%d  ",p->data);
              p=p->next;
       }
       printf("/n");
}
int ListInsert(Lnode *L,int i,int in)//在指定位置上插入一个元素
{
       int j=1;
       Lnode *q=L;
       Lnode *p=(Lnode *)malloc(sizeof(Lnode));
       p->next=NULL;
       p->data=in;
       if(i<1||i>Length(L)+1)
              exit(0);
       while(j<i)
       {
              q=q->next;
              j++;
       }
       p->next=q->next;
       q->next=p;
       return 1;
}
int ListDelete1(Lnode *L,int out)//删除指定的元素 
{
       Lnode *p=L,*q;
       while(p->data!=out)
       {
              q=p;
              p=p->next;
       }
       q->next=q->next->next;
       return 1;
}
int ListDelete2(Lnode *L,int i)//删除指定位置上的元素
{
       int j=1;
       Lnode *p=L,*q;
       if(i<1||i>Length(L))
              exit(0);
       while(j<i)
       {
              p=p->next;
              j++;
       }
       q=p->next;
       p->next=q->next;
       return 1;
}
Lnode *GetElem(Lnode *L,int i)//获取表中某元素
{
       int j=1;
       Lnode *p=L->next;
       if(i<1||i>Length(L))
              return NULL;
       while(j<i)
       {
              p=p->next;
              j++;
       }
       return p;
}
Lnode *PriorElem(Lnode *L,int x)//得到元素x的直接前驱
{
       Lnode *p=L->next,*q=NULL;
       while(p!=NULL&&p->data!=x)
       {
              q=p;
              p=p->next;
       }
       return q;
}
2.主函数
#include "head.h"
void main()
{
       int i;
       printf("/n            ***单链表基本运算的算法演示***/n/n");
       Lnode *L;
       L=(Lnode *)malloc(sizeof(Lnode));
 
       printf("(1)单链表的初始化/n");
       InitList2(L);
 
       printf("/n/n(2)原始单链表的信息/n");
       PrintList(L);
       printf("单链表的长度为:%d/n",Length(L));
 
       printf("/n/n(3)在指定位置插入一个元素/n");
       printf("输入插入的位置及被插入的元素:");
       int in;
       scanf("%d%d",&i,&in);
       ListInsert(L,i,in);
       PrintList(L);
       printf("单链表的长度为:%d/n",Length(L));
 
       printf("/n/n(4)删除单链表中某个元素/n");
       printf("输入待删除元素的值:");
       int out;
       scanf("%d",&out);
       ListDelete1(L,out);
       PrintList(L);
       printf("单链表的长度为:%d/n",Length(L));
 
       printf("/n/n(5)删除单链表中某个位置上的元素/n");
       printf("输入待删除元素的位置:");
       scanf("%d",&i);
       ListDelete2(L,i);
       PrintList(L);
       printf("单链表的长度为:%d/n",Length(L));
 
       printf("/n/n(6)获取单链表的元素/n");
       printf("输入一个位置:");
       scanf("%d",&i);
       printf("该位置上的元素是:%d/n",GetElem(L,i)->data);
 
       printf("/n/n(7)获取某元素的直接前驱/n");
       PrintList(L);
       printf("输入表中某个元素:");
       scanf("%d",&i);
       printf("该元素的直接前驱是:%d/n",PriorElem(L,i)->data);
 
       printf("/n(8)按顺序合并两个有序单链表!/n");
       Lnode *L1,*L2,*L3;
       L1=(Lnode *)malloc(sizeof(Lnode));
       L2=(Lnode *)malloc(sizeof(Lnode));
       L3=(Lnode *)malloc(sizeof(Lnode));
       printf("/nL1的初始化/n");
       InitList2(L1);
       printf("/nL2的初始化/n");
       InitList2(L2);
       InitList1(L3);
       Lnode *p,*q,*t;
       p=L1->next;
       q=L2->next;
       t=L3;
 
       while(p!=NULL&&q!=NULL)
       {
              if(p->data<=q->data)
              {
                     t->next=p;
                     p=p->next;
                     t=t->next;
              }
              else{
                     t->next=q;
                     q=q->next;
                     t=t->next;
              }
       }
       if(p==NULL)
              t->next=q;
       if(q==NULL)
              t->next=p;
       printf("/n合并后单链表长度为:%d",Length(L));
       printf("/n合并后");
    PrintList(L3);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值