链表原理很简单。这里实现了单链表的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;
}