带头节点的单链表的常用操作
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");
}
}
运行结果:
#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");
}
}
运行结果:
相关文章推荐
- 带头节点的链表的一些操作
- C语言——带头节点单链表常见操作
- 带头节点的单链表的基本操作
- 链表操作(不带头节点的)
- 带头节点、带环的双向链表的一些基本操作
- 带头节点单链表操作
- 用头插、尾插、按顺序插入创建一个不带头节点的链表,栈的基本操作
- C语言——带头节点单链表常见操作
- 不带头节点的单链表及其基本操作(Java实现)
- C实现带头节点带环双向链表的操作
- 带头节点的单链表及其基本操作(Java实现)
- 不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作
- 带头节点的单链表的插入操作优化
- 带头节点链表的操作(链表的创建、删除、查找、逆转、打印等等)
- 不带头节点的双向循环链表的基本操作
- 带头结点和不带头结点的单链表的尾插法以及各种操作
- 带头结点的循环链表基本操作
- 链表常用操作 (定义,创建,反转,合并,交叉)
- 带头节点循环单链表的操作(创建,保序插入,指定插入,删除指定表元,删除相同元素,统计某元素表元个数)
- JavaScript 节点操作Dom的常用属性和方法