线性表之单链表实现
#include<stdio.h>
#include<malloc.h>
#include<time.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct node{
ElemType data;
node *next;
}Node,*LinkList;
Status GetListLength(LinkList L){//获取链表的长度;
int num=0;
while(L->next){
L = L->next;
num++;
}
return num;
}
Status GetElem(LinkList L,int i,ElemType &e){//获取第i个位置的值;
int j=1;
LinkList p;
p=L->next;
while(p && j<i){
p = p->next;
j++;
}
if(!p || i>j){
return ERROR;
}
e = p->data;
return OK;
}
Status CreatList(LinkList &L,int n){//创建链表;
LinkList p,q;
int i;
L = (LinkList)malloc(sizeof(Node));
q =L;
for(int i=0; i<n; i++){
p = (LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
q->next = p;
q = p;
}
q->next = NULL;
return OK;
}
void ListTraverse(LinkList L){//遍历链表;
if(L->next == NULL)
printf("LinkList is empty!!!");
else{
LinkList p;
p = L->next;
while(p!= NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
}
Status ListInsert(LinkList &L,int i,ElemType e){//链表元素的插入;
int j=1;
LinkList p,s;
p = (L);
while(p && j<i){
p = p->next;
j++;
}
if(!p || i<j) return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList &L,int i,ElemType &e){//链表元素的删除;
int j=1;
LinkList p,q;
p = L;
while(p && j<i){
p = p->next;
j++;
}
if(!p || i<j) return ERROR;
q = p->next;
e = q->data;
p->next = q->next;
free(q);
return OK;
}
Status ClearList(LinkList &L){//清空链表;
LinkList p,q;
p = (L)->next;
while(p){
q = p->next;
free(p);
p = q;
}
(L)->next = NULL;
return OK;
}
int main(){
LinkList L;
CreatList(L,10);
printf("初始化10个元素,分别是:\n");
ListTraverse(L);
ElemType e;
GetElem(L,5,e);
printf("链表中第5个元素是:%d\n",e);
printf("链表的长度是:%d\n",GetListLength(L));
printf("在链表第6个元素之前插入12\n");
ListInsert(L,6,64);
ListTraverse(L);
printf("在链表中删除第4个元素\n");
ListDelete(L,4,e);
ListTraverse(L);
printf("清空链表\n");
ClearList(L);
return OK;
}
注:本文代码使用 ‘&’引用传递做函数参数实现,大家运行代码时建c++文件;