#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//定义结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//链表初始化
LinkList InitList_L(){
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return L;
}
//判断链表是否空
int ListEmpty(LinkList L){
if(L->next){
printf("no empty\n");
return 0;
} else {
printf("empty\n");
return 1;
}
}
//单链表的销毁
Status Destory_L(LinkList &L){
LNode *p;
while(L != NULL){
p = L;
L =L->next;
free(p);
}
return 0;
}
//单链表的清空
Status ClearList(LinkList &L){
LNode *p, *q;
p = L->next;
while(p != NULL){
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return OK;
}
//求单链表的长度
int Listlength_L(LinkList L){ //返回L中的元素个数
LinkList p;
p = L->next; //P指向第一个结点
int i = 0;
while(p != NULL){
i++;
p = p->next;
}
printf("length:%d\n",i);
return i;
}
//头插法
void CreatList_H(LinkList &L){ //n为插入结点数
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
int n;
printf("请输入结点个数");
scanf("%d",&n);
for(int i=n; i>0; i--){
LNode *p = (LNode*)malloc(sizeof(LNode));
printf("请输入数据元素");
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}
//尾插法
void CraetList_R(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *r = L; //尾指针指向头结点
int n;
printf("请输入结点个数");
scanf("%d ",&n);
for(int i=0; i<n; i++){
LNode *p = (LNode*)malloc(sizeof(LNode));
printf("请输入数据元素\n");
scanf("%d",&p->data); //生成新结点,输入元素
p->next = NULL;
r->next = p; //新结点插入到表尾
r = p; //r指向新结点
}
}
//打印链表
void printlist(LinkList L){
LNode *p = L->next;
while(p){
printf("%d ",p->data );
p = p->next;
}
printf("\n");
}
//指定位置插入元素
Status ListInsert_L(LinkList &L){
LNode *p = L; int j = 0; int e,i;
printf("请输入插入位置\n");
scanf("%d",&i);
printf("请输入插入元素\n");
scanf("%d",&e);
while(p != NULL && j < i-1){
p = p->next;
j++;
} //寻找第i-1个结点,p指向i-1
if(!p || j > i-1) return ERROR; //i大于表长或小于1,位置非法
LNode *s = (LinkList)malloc(sizeof(LNode)); //生成新结点
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//单链表的删除结点
Status ListDelete_L(LinkList &L){
LNode *p = L;
int j = 0;
int i,e;
printf("请输入删除结点的位置\n");
scanf("%d",&i);
while(p && j< i-1){
p = p->next;
j++;
}
if(!p || j>i-1) return ERROR; //位置非法
LNode *q = p->next;
p->next = q->next;
e = q->data; //保存删除结点的元素,释放删除结点的空间
free(q);
return OK;
}
//程序入口
int main(void){
LNode* L = InitList_L();
ListEmpty(L);
CreatList_H(L);//头插法
//CraetList_R(L);//尾插法
printlist(L);
ListInsert_L(L);//插入元素
printlist(L);
Listlength_L(L);//长度
ListDelete_L(L);//删除元素
printlist(L);
Listlength_L(L);
}
链表的代码
最新推荐文章于 2023-11-28 16:43:41 发布