C语言单链表代码实现

#include<stdio.h>

//#include<string.h>

//#include<math.h>

#include<stdlib.h>

//函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define NULL 0

//Status是函数的类型,其值是函数结果状态代码

typedef int Status;

typedef struct{

char num[8];//学号

char name[8];//姓名

int score;//成绩

}ElemType;

//声明结点的类型和指向结点的指针类型

typedef struct Lnode{

ElemType data; //结点的数据域

struct Lnode *next; //结点的指针域

}LNode,*LinkList; //LinkList为指向结构体Lnode的指针类型

//单链表初始化

Status InitList_L(LinkList &L){

L=(LinkList)malloc(sizeof(LNode));//生成新结点作为头结点,用头指针L指向头结点

L->next=NULL;//将头结点的指针域置空

return OK;

}

//判断链表是否为空

int ListEmpty(LinkList L){

if(LinkList->next) return FALSE;//非空表

else return TRUE;//空表

}

//销毁单链表L

Status DestoryList_L(LinkList &L){

Lnode *p;

while(L){

p=L;

L=L->next;

free(&p);

}

return OK;

}

//清空链表

Status ClearList(LinkList &L){

Lnode *p,*q;//p存放要删除的结点,q存放指针p的下一个结点

p=L->next;//p指向首元结点

while(p){

q=p->next;

free(&p);

p=q;

}

L->next=NULL;//头结点指针域置空

return OK;

}

//单链表的表长

int ListLength_L(LinkList L){

Lnode *p;

p=L->next;//p指向首元结点

int i=0;

while(p){

i++;

p=p->next;

}

return i;

}

//取值

Status GetElem_L(LinkList L,int i,ElemType &e){//获取线性表L中第i个数据元素的内容,通过变量e返回

Lnode *p;

p=L->next;//p指向首元结点

int j=1;

while(p && j<i){

p=p->next;

j++;

}

if(!p || j>i) return ERROR;//第i个元素不存在

e=p->data;//取得第i个元素

return OK;

}

//按值查找——返回地址

Lnode *LocateElem_L(LinkList L,Elemtype e){

Lnode *p;

p=L->next;//p指向首元结点

while(p && p->date!=e){

p=p->next;

}

return p;

}

//按值查找——返回位置序号

int LocateElem_L(LinkList L,Elemtype e){

Lnode *p;

p=L->next;//p指向首元结点

int j=1;

while(p && p->date!=e){

p=p->next;

j++;

}

if(p) return j;

else return NULL;//未找到

}

//插入新的值

Status ListInsert_L(LinkList &L,int i,Elemtype e){//在第i个元素之前插入数据元素e

Lnode p=L;

int j=0;

while(p && j<i-1){

p=p->next;

j++;

}

if(!p || j>i-1) return ERROR;//i>表长+1或者i<1,插入位置非法

//插入合法,进行插入操作

s=new Lnode;//生成新结点s,将结点s的数据域置为e

s->data=e;

s->next=p->next;

p->next=s;

return OK;

}

//删除第i个结点

Status ListDelete_L(LinkList &L,int i,Elemtype &e){

p=L;

int j=0;

while(p->next && j<i-1){//寻找第i个结点,并且令p指向其前驱

p=p->next;

j++;

}

if(!(p->next) || j>i-1) return ERROR;//删除位置不合理

q=p->next;//用q来保存要删除的结点

p->next=q->next;//改变删除结点的前驱结点的指针域

e=q->data;//保存删除结点的数据域

free(&q);

return OK;

}

//头插法建立单链表

void CreateList_H(LinkList &L,int n){

L=new LNode;

L->next=NULL;//创建一个带头结点的单链表

for(int i=n;i>0;i--){

p=(LinkList)malloc(sizeof(LNode));;//生成新结点

scanf(&p->data);//输入元素值

p->next=L->next;//插入到表头

L->next=p;

}

}

//尾插法建立单链表

void CreateList_R(LinkList &L,int n){

L=new LNode;

L->next=NULL;//创建一个带头结点的单链表

r=L;//尾指针r指向头结点

for(int i=0;i<n;i++){

p=(LinkList)malloc(sizeof(LNode));;//生成新结点

p->next=NULL;

r->next=p;//插入到表尾

r=p; //r指向新的尾结点

}

}

int main(){

//定义链表L

LinkList L;

//定义结点指针p

LNode *p;

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值