说到链表,从大一就开始折腾,不复杂的一个东西愣是到现在也没好好实现过。说到底是自己执行力太低了。准备考研也有一段时间了,数据结构看了也有一段时间,该写点代码了。
链表没什么好说的,概念和方法都很简单,就直接贴代码吧,下面的实现是带头结点的。想了下,C++自己太半桶水了,还是老实用C吧,等初试完了再好好看看C++.
LinkList.h
#ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED typedef int ElemType; struct Node; typedef struct Node* PtrToNode; typedef PtrToNode LinkList; typedef PtrToNode Position; LinkList L_creatList(); void L_destroyList(LinkList list); void L_makeEmpty(LinkList list); void L_insert(Position pos, ElemType elem); void L_delete(LinkList list, ElemType elem); Position L_find(LinkList list, ElemType elem); /* Locate the previous node for delete method */ Position L_findPre(LinkList list, ElemType elem); int L_isEmpty(LinkList list); /* routine for test */ void L_printList(LinkList); //PtrToNode L_header(LinkList list); #endif // LINKLIST_H_INCLUDED
implementation is in the source file LinkList.c
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "LinkList.h"
typedef struct Node
{
ElemType data;
PtrToNode next;
}Node;
LinkList L_creatList()
{
LinkList L;
L = malloc(sizeof(Node));
/* Check the alloction */
assert(L != NULL);
L->next = NULL;
return L;
}
Position L_find(LinkList list, ElemType elem)
{
Position p = list->next;
while(p != NULL){
if(p->data == elem)
return p;
p = p->next;
}
/* Not found */
return NULL;
}
Position L_findPre(LinkList list, ElemType elem)
{
Position pre = list;
Position cur = pre->next;
while(cur != NULL){
if(cur->data == elem)
return pre;
pre = pre->next;
cur = pre->next;
}
return NULL;
}
/* Insert the Node after the position */
void L_insert(Position pos, ElemType elem)
{
Position tmp = malloc(sizeof(Node));
assert(tmp != NULL);
tmp->data = elem;
tmp->next = NULL;
tmp->next = pos->next;
pos->next = tmp;
}
int L_isEmpty(LinkList list)
{
return list->next == NULL;
}
void L_delete(LinkList list, ElemType elem)
{
Position pre = L_findPre(list, elem);
if(pre != NULL){
Position tmp = pre->next;
pre->next = tmp->next;
free(tmp);
}
}
void L_makeEmpty(LinkList list)
{
LinkList L = list;
Position tmp;
while(L->next != NULL){
tmp = L->next;
L->next = tmp->next;
free(tmp);
}
}
void L_destroyList(LinkList list)
{
L_makeEmpty(list);
free(list);
}
/* This routine just for test */
void L_printList(LinkList list)
{
LinkList L = list->next;
while(L != NULL){
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
之后几天把基本的数据结构补齐,就可以写写基本的算法了,包括之前写的排序,准备再用C实现下。
浙公网安备 33010602011771号