单链表-LinkList

数据结构单链表-LinkList 参考书:《数据结构(C语言)》作者:严蔚敏

文中的LinkList无头结点。

如果发现错误,请帮忙指正,谢谢。

转载请注明@author vaneng

LinkList.h

/*单链表*/
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next_ptr;
}LNode, *LinkList;
/*author vaneng*/
LNode *makeNode(ElemType e);
void freeNode(LNode *n_ptr);
void destroyList(LinkList list);
void clearList(LinkList list);
void insertFirst(LinkList *l_ptr, LNode node);
void deleteFirst(LinkList *l_ptr, LNode *aN_ptr);
void append(LinkList *l_ptr, LNode node);
void removeLast(LinkList *l_ptr, LNode *n_ptr); //删除尾结点,将结果存储到n_ptr
void insertBefore(LinkList *l_ptr, LNode *aN_ptr, LNode node);
void insertAfter(LNode *aN_ptr, LNode node);
void setCurElem(LNode *n_ptr, ElemType e);
ElemType getCurElem(LNode *n_ptr);
int listEmpty(LinkList list);
int listLength(LinkList list);
LNode *getHead(LinkList list);
LNode *getLast(LinkList list);
LNode *priorPos(LinkList list, LNode *aN_ptr);
LNode *nextPos(LinkList list, LNode *n_ptr);
void locatePos(LinkList list, int i, LNode *aN_ptr);
LNode *locateElem(LinkList list, ElemType e, int (*compare)(ElemType, ElemType));
void listTraverse(LinkList list);

void error(char *name, char *msg); //显示错误信息msg
void warning(char *msg);


LinkList.c

#include "LinkList.h"
#include <malloc.h>
#include <stdio.h>
/*author vaneng*/
LNode *makeNode(ElemType e){
LNode *n_ptr = (LNode *)malloc(sizeof(LNode));
if(!n_ptr){
error("makeNode", "Malloc failed");
return 0;
}
n_ptr->data = e;
n_ptr->next_ptr = 0;
return n_ptr;
}
void freeNode(LNode *n_ptr){
warning("Please make sure that the next_ptr of n_ptr is null");
n_ptr->next_ptr = 0;
free(n_ptr);
}
/*LNode *initList()
在这种数据结构下没有意义
*/
void destroyList(LinkList list){
LNode *n_ptr = list;
while(list){
list = list->next_ptr;
n_ptr->next_ptr=0;
free(n_ptr);
n_ptr=list;
}
}
void clearList(LinkList list){
/*我觉得在这种数据结构下和destroy没有区别吧*/
}
void insertFirst(LinkList *l_ptr, LNode node){
/*因为可能修改头指针,所以用LinkList *l_ptr
值传递,l_ptr这个值是没法修改的。
*/
LNode *n_ptr = (LNode *)malloc(sizeof(LNode));
*n_ptr = node;
//n_ptr->data = aNode.data;
/*next_ptr是一个指针,*l_ptr也是一个指针*/
n_ptr->next_ptr = *l_ptr;
*l_ptr = n_ptr;
}
void deleteFirst(LinkList *l_ptr, LNode *aN_ptr){
LNode *n_ptr = *l_ptr;
*aN_ptr = **l_ptr;
*l_ptr = (*l_ptr)->next_ptr;
free(n_ptr);
n_ptr = 0;
}
void append(LinkList *l_ptr, LNode node){
LNode *n_ptr = (LNode *)malloc(sizeof(LNode));
LNode *cursor_ptr = *l_ptr;
*n_ptr = node;
n_ptr->next_ptr = 0;
if(!cursor_ptr) /*l_ptr所指向指针(list)是一个null*/
insertFirst(l_ptr, node);
else{
while(cursor_ptr->next_ptr){
cursor_ptr = cursor_ptr->next_ptr;
}
cursor_ptr->next_ptr = n_ptr;
}
}
void removeLast(LinkList *l_ptr, LNode *n_ptr){
LNode *cursor_ptr = *l_ptr;
if(!cursor_ptr){
error("remove", "There is no node in the list!");
return;
}
if(!cursor_ptr->next_ptr)
deleteFirst(l_ptr, n_ptr);
else{
while(cursor_ptr->next_ptr->next_ptr){
cursor_ptr = cursor_ptr->next_ptr;
}
free(cursor_ptr->next_ptr);
cursor_ptr->next_ptr=0;
}
}
void insertBefore(LinkList *l_ptr, LNode *aN_ptr, LNode node){
LNode *cursor_ptr = *l_ptr;
LNode *n_ptr = (LNode *)malloc(sizeof(LNode));
n_ptr->data = node.data;
n_ptr->next_ptr = aN_ptr;
if(cursor_ptr == n_ptr)
insertFirst(l_ptr, node);
else{
while(cursor_ptr->next_ptr!=aN_ptr)
cursor_ptr = cursor_ptr->next_ptr;
cursor_ptr->next_ptr = n_ptr;
}
}
void insertAfter(LNode *aN_ptr, LNode node){
LNode *n_ptr = (LNode *)malloc(sizeof(LNode));
n_ptr->data = node.data;
if(!aN_ptr){
error("insertAfter", "aN_ptr is null");
return;
}
n_ptr->next_ptr = aN_ptr->next_ptr;
aN_ptr->next_ptr = n_ptr;
}
void setCurElem(LNode *n_ptr, ElemType e){
if(!n_ptr){
error("setCurElem", "n_ptr is null");
return;
}
n_ptr->data = e;
}
ElemType getCurElem(LNode *n_ptr){
if(!n_ptr){
error("getCurElem", "n_ptr is null");
return 0;
}
return n_ptr->data;
}
int listEmpty(LinkList list){
return list?1:0;
}
int listLength(LinkList list){
LNode *n_ptr = list;
int length = 0;
while(n_ptr&&++length)
n_ptr = n_ptr->next_ptr;

return length;
}
LNode *getHead(LinkList list){
return list;
}
LNode *getLast(LinkList list){
LNode *n_ptr = list;
if(!n_ptr){
error("getLast", "n_ptr is null");
return 0;
}
while(n_ptr->next_ptr){
n_ptr = n_ptr->next_ptr;
}
return n_ptr;
}
LNode *priorPos(LinkList list, LNode *aN_ptr){
LNode *n_ptr = list;
if(aN_ptr == list){
error("priorPos", "aN_ptr is the first node");
return 0;
}
while(n_ptr&&n_ptr->next_ptr!=aN_ptr)
n_ptr = n_ptr->next_ptr;
if(n_ptr){
return n_ptr;
}else{
error("priorPos", "aN_ptr is not in the list");
return 0;
}
}
LNode *nextPos(LinkList list, LNode *n_ptr){
if(n_ptr)
return n_ptr->next_ptr;
error("nextPos", "n_ptr is null");
return 0;
}
void locatePos(LinkList list, int i, LNode *aN_ptr){
LNode *n_ptr = list;
int cursor = 0;
while(n_ptr&&cursor!=i){
n_ptr = n_ptr->next_ptr;
}
*aN_ptr = *n_ptr;
}
LNode *locateElem(LinkList list, ElemType e, int (*compare)(ElemType, ElemType)){
LNode *n_ptr = list;
while(n_ptr&&!compare(n_ptr->data, e)){
n_ptr = n_ptr->next_ptr;
}
if(n_ptr)
return n_ptr;
else{
return 0;
}
}
void listTraverse(LinkList list){
LNode *n_ptr = list;
printf("\nlist: ");
while(n_ptr){
printf("%2d ", n_ptr->data);
n_ptr = n_ptr->next_ptr;
}
printf("\n");
}

void error(char *name, char *msg){
printf("-----Errors occured in \"%s\"!-----\n", name);
printf(" %s!\n",msg);
printf("\n");
}
void warning(char *msg){
printf("\n %s!\n\n");
}



test.c

#include "LinkList.h"
int compare(ElemType e1, ElemType e2){
return e1==e2?1:0;
}
int main(){
LinkList list;
LNode node;
LNode *n_ptr;
node.data = 0;
node.next_ptr = 0;

list = makeNode(1);
//listTraverse(list);
insertFirst(&list, node);
//listTraverse(list);
deleteFirst(&list, &node);
//listTraverse(list);
insertFirst(&list, node);
//listTraverse(list);

node.data = 2;
append(&list, node);
listTraverse(list);
removeLast(&list, &node);
//listTraverse(list);
append(&list, node);
listTraverse(list);
node.data = 3;
append(&list, node);
node.data = 4;
append(&list, node);
node.data = 5;
append(&list, node);
node.data = 6;
append(&list, node);
node.data = 7;
append(&list, node);
listTraverse(list);
n_ptr = locateElem(list, 5, compare);

node.data = 8;
insertBefore(&list, n_ptr, node);
node.data = 9;
insertAfter(n_ptr, node);

setCurElem(n_ptr, 10);

setCurElem(getHead(list), 11);
setCurElem(getLast(list), 12);
setCurElem(priorPos(list, n_ptr), 13);
setCurElem(nextPos(list, n_ptr), 14);
printf("getCur: %d %d\n", getCurElem(n_ptr), listLength(list));

listTraverse(list);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值