您的位置:首页 > 其它

带头节点的单链表的常用操作

2014-08-24 21:42 357 查看
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 //因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE

typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;

Status InitList(LinkList &L){
//构造一个空的线性表L。
L=(LinkList)malloc(sizeof(LNode)); //产生头结点,并使L指向此头结点
if(!L) exit(OVERFLOW); //分配存储失败
L->next=NULL; //指针域为空
return OK;
}//InitList

Status DestroyList(LinkList &L){
//初始条件:线性表L已存在。操作结果:销毁线性表L。
LinkList q;
while(L){
q=L->next;
free(L);
L=q;
}
return OK;
}//DestroyList

int ListLength(LinkList L){
int i=0;
LinkList p=L->next;
while(p){
i++;
p=p->next;
}
return i;
}

Status ListInsert(LinkList &L,int i,ElemType e){
//在带头结点的单链表L中第i个位置之前插入元素e
LinkList p,s;
int j=0;
p=L;
while(p && j<i-1 ){ //寻找第i-1个结点,并要求第i-1个结点非空
p=p->next;
j++;
}
if(j>i-1 || !p) return ERROR;//i值的合法范围的判断,i<1或i>表长+1,均不合法
s=(LinkList)malloc(sizeof(LNode));
s->next=p->next;
p->next=s;
s->data=e;
return OK;
}

Status ListDelete(LinkList &L,int i,ElemType &e){
//在带头结点的单链表L中,删除第i个元素,并由e返回其值
int j=0;
LinkList p,q;
p=L;
while(p->next && j<i-1 ){//寻找第i-1个结点,并要求第i个结点非空
p=p->next;
j++;
}
if(j>i-1 || !p->next) return ERROR;//i值的合法范围的判断,i<1或i>表长,均不合法
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}

void CreateList(LinkList &L,int n){
//建立带头节点的单链线性表L
int i=0;
LinkList p1,p2;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p1=L;
while(i<n)
{
p2=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p2->data);
p1->next=p2;
p1=p2;
i++;
}
p2->next=NULL;
}

void ListVisit(LinkList L){
//遍历单链表
LinkList p;
p=L->next;
printf("链表的数据为: ");
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n ");
}

Status GetElem(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK;否则返回ERROR
LinkList p,q;
int k=1;
p=L->next;
while(p && k<i){
++k;
p=p->next;
}
if(!p || k>i) return ERROR;
e=p->data;
return OK;
}

void main(){
int n,i;
ElemType e;
Status sta;
LinkList L;
int a[3]={1,2,3};

if(InitList(L))
{
printf("创建空单链表L成功\n");
}
if(DestroyList(L))
{
printf("销毁空单链表L成功\n");
}
printf("请输入所需建立的节点数(正整数):");
scanf("%d",&n);
printf("请输入%d个节点的数据:",n);
CreateList(L,n);
ListVisit(L);
printf("在第几位置插入元素(1~%d):",ListLength(L)+1);
scanf("%d",&i);
printf("插入元素为:");
scanf("%d",&e);
sta=ListInsert(L,i,e);
printf("插入成功了吗:1(是),0(否) :%d\n",sta);
ListVisit(L);
printf("删除第几个元素(1~%d):",ListLength(L));
scanf("%d",&i);
sta=ListDelete(L,i,e);
printf("删除成功了吗:1(是),0(否) :%d\n",sta);
ListVisit(L);
if(DestroyList(L))
{
printf("销毁单链表L成功\n");
}
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: