#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;
}