线性表
数组实现
链表实现
头文件与结构体定义
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node* next;
}Lnode,Linklist;
初始化链表
Linklist *init(Linklist *L){
L = (Linklist *)malloc(sizeof(Linklist));
L->next = NULL;
L->data = 0;
return L;
}
链表是否为空
int isEmpty(Linklist *L){
if(L->next==NULL)return 1;
return 0;
}
销毁链表
int destroy(Linklist *L){
Lnode *p;
while(L){
p = L;
L = L->next;
free(p);
}
return 1;
}
清空链表
int clear(Linklist *L){
Linklist *p,*q;
p=L->next;
while(p!=NULL){
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return 1;
}
获取链表长度
int length(Linklist *L){
Linklist *p;
p = L->next;
int length = 0;
while(p!=NULL){
length++;
p = p->next;
}
return length;
}
获取指定位置元素
int get(Linklist *L,int i,ElemType *e){
Linklist *p;
p = L->next;
int j=1;
//向后扫描,直到p指向第i个元素或NULL
while(p&&j<i){
p=p->next;
++j;
}
//第i个元素不存在
if(!p||i<j)return 0;
//获取第i个元素的数据
*e = p->data;
return 1;
}
定位元素获取地址
Lnode *locate(Linklist *L,ElemType e){
Linklist *p;
p=L->next;
while(p&&p->data!=e)p=p->next;
return p;//返回元素地址 未找到时返回NULL 找到返回节点地址
}
定位元素获取序号
int elemLocate(Linklist *L,ElemType e){
Linklist *p;
p=L->next;
int i=1;
while(p&&p->data!=e){
p = p->next;
i++;
}
if(p){
return i;
}else{
return 0;//未找到元素
}
}
插入元素
int insert(Linklist *L,int i,ElemType e){
Linklist *p;
p=L;
int j=0;
while(p && j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)return 0;
Lnode *s = (Lnode *)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
删除元素
int remove(Linklist *L,int i,ElemType *e){
Linklist *p = L,*q;
int j = 0;
//寻找第i个结点并指向其前驱
while(p->next&&j<i-1){
p = p->next;
j++;
}
//删除位置不合理
if(!p&&j>i-1)return 0;
//q指针保存要删除元素的地址
q = p->next;
//将要删除的元素的前驱指向其后面一个元素
p->next = q->next;
//保存要删除的结点数据
*e = q->data;
//释放内存
free(q);
//删除成功
return 1;
}
打印链表
int print(Linklist *L){
Linklist *t;
t = L->next;
if(t==NULL){
printf("链表已为空!");
return 0;
}
printf("L(%d)->[HEAD:%d|%d]->",L,L->data,L->next);
while(t){
if(!t->next){
printf("[%d|%s]",t->data,"NULL");break;
}
printf("[%d|%d]",t->data,t->next);
if(t->next)printf("->");
t = t->next;
}
return 1;
}
链表头插法
int createList_H(Linklist *L,int n){
L->next = NULL;
for(int i=n;i--;i>0){
Lnode *p = (Lnode *)malloc(sizeof(Lnode));
printf("(%d)>",p);
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return 1;
}
链表尾插法
int createList_R(Linklist *L,int n){
Linklist *r;
L->next = NULL;
r = L;
for(int i=0;i<n;i++){
Lnode *p = (Lnode *)malloc(sizeof(Lnode));
printf("(%d)>",p);
scanf("%d",&p->data);
p->next = NULL;
r->next = p;
r = p;
}
return 1;
}