一、单链表的操作
1.头插法建立单链表。2.尾插法建立单链表3.初始化单链表、4.销毁单链表、5.判断单链表是否为空表。6.求单链表的长度。7.输出单链表。8.求单链表中的某个数据元素值。9.按元素值查找。10.插入数据元素.11.删除数据元素
二、具体代码(不可运行,非完整代码!)
代码如下:
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode* next;
}LinkNode;
//头插法建立单链表
void CreateListF(LinkNode*&L,ElemType a[],int n){
LinkNode *s;
L = (LinkNode*)malloc(sizeof(LinkNode));//建立头结点
L->next = NULL;
for(int i = 0;i<n;i++){
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = ElemType a[i];
s->next = L->next;//在第一轮时,是将L的NULL传给s的->next域
L->next = s;//将结点s插入首结点之前,头结点之后
}
}
//尾插法建立单链表
void CreateListR(LinkNode*&L,ElemType a[],int n){
LinkNode*r;
LinkNode*s;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
r = L;
for(int i = 0;i<n;i++){
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = ElemType a[i];
r->next = s;
r = s;
r->next = NULL;
}
}
//初始化线性表
void InitList(LinkNode*&L){
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
}
//销毁线性表
void DestroyList(LinkNode*&L){
LinkNode*pre;
LinkNode*p;
pre = L;
p = pre->next;
while(p){
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
//判断线性表是否为空表
bool ListEmpty(LinkNode*L){
if(L->next == NULL){
return true;
}
else
return false;
}
//求单链表的长度
int ListLength(LinkNode*L){
int n = 0;
LinkNode*p = L;
while(p){
n++;
p = p->next;
}
return n;
}
//输出单链表
void DispList(LinkNode*L){
LinkNode*p;
p = L->next;
whlie(p){
printf("%d",p->data);
p = p->next;
}
}
//求线性表中某个位置的值
bool GetElem(LinkNode*L;int i;ElemType &e){//用e来接收i位置的元素值
LinkNode*p;
p = L;
int j = 0;
if(i<=0){
return false;
}
while(j<i&&p!=NULL){
j++;
p = p->next;
}
if(p){
e = p->data;
return true;
}
else{
return false;
}
}
//按元素值查找
int LocateElem(LinkNode*L,ElemType e){
int i = 1;
LinkNode *p = L->next;
while(p&&p->data != e){
i++;
p = p->next;
}
if(p){
return i;
}
else
return 0;
}
//插入元素
bool ListInsert(LinkNode*&L,int i,ElemType e){
int j = 0;//这个是计数用的,目的是为了让p指针指向第i个元素的前一个位置
LinkNode *p = L;
LinkNode *s;
if(i<=0){
return false;
}
while(p&&j<i-1){
j++;
p = p->next;
}
if(p){
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
//删除数据元素
bool ListInsert(LinkNode*&L,int i,ElemType &e){
int j = 0;
LinkNode*p = L;
LinkNode q;//在后面要用于连接被删元素左右的元素的链接
if(i<=0){
reture false;
}
while(p&&j<i-1){
j++;
p = p->next;
}
if(p){
q = p->next;//此处q指向的是被删元素
if(q){
e = q->data;
p->next = q->next;
free(q);
return true;
}
else{
return false;
}
}
}
总结
由于代码并未实际运行过,可能存在bug。