链表ADT详解

链表原理很简单。这里实现了单链表的ADT。主要的操作有:

节点结构提的定义:

struct Node
{
 int element;
 struct Node *next;
};

以及链表的常见操作

 /*生成一个空表,该链表只有头节点*/
List creatList(void)

/*判断一个链表是否为空,形参为头节点指针;
  为空返回1,否则返回0;
  */
int isEmpty(List L)

/*每次插入均是在表头节点之后插入*/
void insert_1(int x, List L)

/*在链表中查找某个元素。
若找到,返回节点指针;否则返回NULL
*/
List find(int x, List L)

/*在链表中查找某个元素前面一个节点
若找到,返回那个节点指针;否则返回NULL
*/
List findPrevious(int x,List L)

/*在节点p之后插入一个元素节点*/
void insert_2(int x, List L, struct Node * p)

/*删除一个节点*/
void deleteElement(int x, List L)

/*删除整个链表,头节点不删除*/
void deleteList(List L)

 

具体参考代码如下所示:

#include<stdio.h>
#include<stdlib.h>
struct Node
{
 int element;
 struct Node *next;
};
typedef struct Node*  List;

 /*生成一个空表,该链表只有头节点*/
List creatList(void)
{
 List L = (List)malloc(sizeof(struct Node));
 if(L==NULL)
 {
  printf("memory overflow\n");
  exit(1);
 }
 L->element =0;
 L->next =NULL; 
 return L;
}

/*判断一个链表是否为空,形参为头节点指针;
  为空返回1,否则返回0;
  */
int isEmpty(List L)
{
 if(L == NULL)
 {
  printf("表头节点不能为NULL\n");
  exit(1);
 }
 return L->next==NULL?1:0;
}

/*每次插入均是在表头节点之后插入*/
void insert_1(int x, List L)
{
 List temp = (List)malloc(sizeof(struct Node));
 if(temp==NULL)
 {
  printf("memory overflow\n");
  exit(1);
 }
 temp->element =x;
 temp->next = L->next;
 L->next =temp;
}

/*在链表中查找某个元素。
若找到,返回节点指针;否则返回NULL
*/
List find(int x, List L)
{
 List p = L->next;
 while(p!=NULL && p->element!=x)
  p = p->next;
 return p;
}
/*在链表中查找某个元素前面一个节点
若找到,返回那个节点指针;否则返回NULL
*/
List findPrevious(int x,List L)
{
 List p = L;
 while( p->next!=NULL && p->next->element!=x)
  p =p->next;
 if(p->next==NULL)
  return NULL;
 else
  return p;
}

/*在节点p之后插入一个元素节点*/
void insert_2(int x, List L, struct Node * p)
{
 List temp = (List)malloc(sizeof(struct Node));
 if(temp==NULL)
 {
  printf("memory overflow\n");
  exit(1);
 }
 temp->element = x;
 temp->next = p->next;
 p->next =temp;
}

/*删除一个节点*/
void deleteElement(int x, List L)
{
 List p =find(x,L);
 List previous;
 if(p==NULL)
 {
  printf("%d is not existed in List\n");
  return ;
 }
 previous=findPrevious(x,L);
 previous->next= p->next;
 free(p);
}

/*删除整个链表,头节点不删除*/
void deleteList(List L)
{
 List p = L->next;
 while(p!=NULL)
 {
  List temp;
  temp=p->next;
  free(p);
  p=temp;
 }
 L->next=NULL;
}

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值