链表结构
typedef int ElemType;
typedef int Bool;
#define True 1
#define False 0
typedef enum{
success = 0,
fail,
range_error,
fatal
}Status;
typedef struct node{
ElemType data;
struct node * next;
}Node, *PNode;
线性表操作
- 初始化 :
时间复杂度: O(1)
Status initList(PNode *header){
Status s = success;
if((*header) == NULL){
Node *p= (Node *)malloc(sizeof(Node));
if(p){
p -> next = NULL;
*header = p;
}else{
s = fatal;
}
}
return s;
}
- 清空 :
时间复杂度: O(n)
void clearList(PNode header){
Node *deleteNode,*ptr=header;
if(header){
Node *deleteNode,*ptr=header;
while(ptr -> next) {
deleteNode = ptr->next;
ptr->next = deleteNode ->next;
free(deleteNode);
}
deleteNode = NULL;
}
}
- 销毁 :
时间复杂度: O(1)
void destroyList(PNode *header){
if(*header){
clearList(*header);
free(*header); // 释放头节点
*header = NULL;
}
}
- 查询(按位置) :
时间复杂度: O(n)
Status retrieveByPos(PNode header, int pos, ElemType *ele){
Status s = range_error;
Node *ptr = header -> next; //ptr point to the first node
int i = 1;
while(ptr != NULL && i < pos) {
i++;
ptr = ptr ->next;
}
if(i == pos && ptr) {
*ele = ptr->data;
s = success;
}
return s;
}
- 查询(按值) :
时间复杂度: O(n)
Status locateByValue(PNode header, ElemType value ,int *pos){
Status s = range_error;
Node *ptr = header->next;
int i = 1;
while(ptr && ptr->data != value) {
i++;
ptr = ptr->next;
}
if(ptr){
*pos = i;
s = success;
}
return s;
}
- 插入 :
- 时间复杂度: O(n).
Status insertByPos(PNode header, int pos, ElemType ele){
Status s = range_error;
Node *ptr = header; //这里不能指向第一元素,因为可能删除第一个元素
int i = 0;
while(i < pos -1 && ptr) {
i++;
ptr = ptr->next;
}
if (i == pos - 1 && ptr) {
Node *newNode = (Node *) malloc(sizeof(Node));
if(newNode) {
newNode -> data = ele;
newNode -> next = ptr -> next;
ptr ->next = newNode;
s = success;
}else{
s = fatal;
}
}
return s;
}
- 删除 :
- 时间复杂度: O(n)
Status deleteyPos(PNode header, int pos){
Status s= range_error;
Node *ptr = header; //这里不能只想第一元素,因为可能删除第一个元素
int i = 0;
while(i < pos -1 && ptr) {
i++;
ptr = ptr->next;
}
if( i == pos -1 && ptr) { //判断存在第pos-1元素存在
if(ptr -> next != NULL){ //第pos元素(要删除的元素)存在
Node * deleteNode = ptr -> next;
ptr -> next = ptr -> next -> next;
free(deleteNode);
deleteNode = NULL;
s = success;
}
}
return s;
}
- 判断是否为空 :
时间复杂度: O(1)
Bool isEmpty(PNode header){
return (header->next == NULL)? True:False;
}
- 获取线性表大小 :
时间复杂度: O(n)
int getLength(PNode header){
int i = 0;
if(header){
Node *ptr = header->next;
while(ptr != NULL) {
i++;
ptr = ptr -> next;
}
}
return i;
}
- 尾部插入 :
时间复杂度: O(n)
Status appendList(PNode header,int data){
Status s = success;
Node *ptr = header;
while(ptr && ptr->next != NULL){
ptr = ptr ->next;
}
Node *tmp = (Node *) malloc(sizeof(Node));
if(tmp){
tmp -> data = data;
tmp -> next = NULL;
ptr -> next = tmp;
} else{
s = fatal;
}
return s;
}
- 打印:
void printLinkList(PNode header){
if(header){
Node *ptr = header->next;
while(ptr!= NULL){
printf("%d ",ptr->data );
ptr = ptr->next;
}
printf("\n");
}
};
- 创建线性表:
Status createList(PNode *header, ElemType data[],int len) {
Status s;
s = initList(header);
if(s == success) {
Node *tmpPtr;
for (int i = len-1; i >=0 ; i--) {
tmpPtr = (Node *)malloc(sizeof(Node));
if(tmpPtr){
tmpPtr -> data = data[i];
tmpPtr -> next = (*header) -> next;
(*header)->next = tmpPtr;
} else{
s = fatal;
break;
}
}
}
return s;
}