数据结构——单链表

数据结构——单链表

一.预定义常量

#define TRUE    1 
#define FALSE 0
#define OK     1
#define ERROR 0
#define INFEASIBLE -1//infeasible  不可实现的 
#define OVERFLOW -2 //overflow 溢出

二.单链表结构定义

typedef int ElemType; 
typedef int Status;

//单链表存储结构描述 
 typedef struct LNode{
ElemType data;       //数据域
struct LNode *next;  //指针域
}LNode,*LinkList;

三.单链表基本操作

//初始化单链表
 Status InitList(LinkList &L) 
 {
     L=(LinkList)malloc(sizeof(LNode));
     if (!L) exit(OVERFLOW);
     L->next=NULL;
     return OK;
 }
 
 //建立链表   尾插法 
  Status Inputweicha(LinkList &L) 
  {
   LinkList p; 
     int  i,n; 
  printf("\nPlease input the sqlist's lengtgh:") ;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
    printf("please input %dth elem:",(n-i));
    p=(LinkList)malloc(sizeof(LNode));
     scanf("%d",&p->data);
     p->next=L->next;
   L->next=p; 
    } 
 } 
 
 //单链表建立  正插
  Status Inputzhengcha(LinkList &L) 
  {
   int i,n;
   LinkList p,q;
  L->next=NULL;
  q=L;
  printf("\nPlease input the sqlist's lengtgh:") ;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
    printf("please input %dth elem:",(i+1));
    p=(LinkList)malloc(sizeof(LNode));
     scanf("%d",&p->data);
     p->next=NULL;
     q->next=p;
     q=p;
    } 
   
  } 
 
 
 //单链表遍历输出函数
 void Print_L(LinkList L)
 {
  LinkList p;
  p=L->next;
  while(p)
  {
   printf("%d  ",p->data);
   p=p->next;
  }
  printf("\n");
 }
 
 
 
 //单链表插入元素  在带头结点的单链表L中第i个元素之前插入元素e 
 Status ListInsert_L(LinkList &L,int i,ElemType e)
 {
  LinkList p;
  LinkList s;
  p=L;
  int j=0; 
  while(p&&j<i-1)
  {
   p=p->next;
   ++j;
  }
  if(!p||j>i-1)
   return ERROR;
  s=(LinkList)malloc(sizeof(LNode));
  s->data=e;
  s->next=p->next;
  p->next=s;
  return OK; 
 }
 
 //单链表删除元素  在带头结点的单链表L中,删除第i个元素,并由e返回其值
 Status ListDelete_L(LinkList &L,int i,ElemType &e)
 {
  LinkList p;
  LinkList q;
  p=L;
  int j=0;
  while(p->next&&j<i-1)
  {
   p=p->next;
   ++j;
  } 
  if(!(p->next)||j>i-1)
   return ERROR;
  q=p->next;
  p->next=q->next;
  e=q->data;
  free(q);
  return OK;
  } 
  
 
 
 //销毁单链表 
 void DestroyList(LinkList &L) 
 {
  LinkList p; 
     while(L) {
  p=L->next;
  free(L);
  L=p;
     }
 } 
 
 //清空单链表
 void ClearList(LinkList L)
  {
   LinkList p;
     for(p=L->next;p; p=L->next)   
      {
  L->next=p->next;
  free(p);
      }
 }
 
 //单链表判空
 Status ListEmpty(LinkList L) {
     if( !L->next) return TRUE;
     else return FALSE;
 }
 
 //求单链表长度
 int ListLength(LinkList L) 
 {   
  int n;
  LinkList p;
     p=L->next; 
  n=0;   
     while(p)
     { n++; p=p->next; }
     return n;
 }
 
 //单链表取第几个元素值
 Status GetElem(LinkList L, int i, ElemType &e) 
 {
  int j;
  LinkList p;
     j=1;
     p=L->next; 
     while(p &&j<i) { p=p->next; ++j;}
     if( !p || j>i) 
       return ERROR;   
     e=p->data ;
     return OK;
  } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值