/*************************************************************************************/
/* 单链表基本操作函数
/*------------------------------------------------------------------------------------------------------------------------------
/*
/*
/*
/************************************************************************************/
#include <stdio.h> #include <malloc.h> typedef char ElemType; //----------------------------------------------------------------------------------- // 定义单链表结点类型 //----------------------------------------------------------------------------------- typedef struct LNode { ElemType data; struct LNode *next; /*指向后继结点*/ } LinkList;
//===================================================================================
// 头插法建立单链表
// L-->d-->c-->b-->a [逆序]
//===================================================================================
void CreateListF(LinkList *&L, ElemType a[], int n) { int i; LinkList *s; L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/ L->next=NULL; for (i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*/ s->data=a[i]; s->next=L->next; /*将*s插在原开始结点之前,头结点之后*/ L->next=s; } }
//===================================================================================
// 尾插法建立单链表
// L-->a-->b-->c-->d [顺序]
//===================================================================================
void CreateListR(LinkList *&L, ElemType a[], int n) { int i; LinkList *s,*r; L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/ L->next=NULL; r=L; /*r始终指向终端结点,开始时指向头结点*/ for (i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*/ s->data=a[i]; r->next=s; /*将*s插入*r之后*/ r=s; } r->next=NULL; /*终端结点next域置为NULL*/ }
//===================================================================================
// 初始化单链表
//===================================================================================
void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/ L->next=NULL; }
//===================================================================================
// 销毁单链表
//===================================================================================
void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); /*此时q为NULL, p指向尾结点,释放它*/ }
//===================================================================================
// 判断单链表是否为空
//===================================================================================
int ListEmpty(LinkList *L) { return (L->next==NULL); }
//===================================================================================
// 求单链表的长度
//===================================================================================
int ListLength(LinkList *L) { int i=0; LinkList *p=L; while (p->next!=NULL) { i++; p=p->next; } return(i); }
//===================================================================================
// 展示单链表的元素
//===================================================================================
void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\\n"); }
//===================================================================================
// 获取单链表中指定位置的元素值
//===================================================================================
int GetElem(LinkList *L, int i, ElemType &e) { int j=0; LinkList *p=L; while (j<i && p!=NULL) { j++; p=p->next; } if (p==NULL) /*不存在第i个数据结点*/ return 0; else /*存在第i个数据结点*/ { e=p->data; return 1; } }
//===================================================================================
// 获取单链表中某个元素的位置
//===================================================================================
int LocateElem(LinkList *L,ElemType e) { LinkList *p=L->next; int n=1; while (p!=NULL && p->data!=e) { p=p->next; n++; } if (p==NULL) return(0); else return(n); }
//===================================================================================
// 单链表插入新的元素
//===================================================================================
int ListInsert(LinkList *&L,int i,ElemType e) { int j=0; LinkList *p=L,*s; while (j<i-1 && p!=NULL) /*查找第i-1个结点*/ { j++; p=p->next; } if (p==NULL) /*未找到位序为i-1的结点*/ return 0; else /*找到位序为i-1的结点*p*/ { s=(LinkList *)malloc(sizeof(LinkList));/*创建新结点*s*/ s->data=e; s->next=p->next; /*将*s插入到*p之后*/ p->next=s; return 1; } }
//===================================================================================
// 单链表删除元素
//===================================================================================
int ListDelete(LinkList *&L,int i,ElemType &e) { int j=0; LinkList *p=L,*q; while (j<i-1 && p!=NULL) /*查找第i-1个结点*/ { j++; p=p->next; } if (p==NULL) /*未找到位序为i-1的结点*/ return 0; else /*找到位序为i-1的结点*p*/ { q=p->next; /*q指向要删除的结点*/ if (q==NULL) return 0; /*若不存在第i个结点,返回0*/ p->next=q->next; /*从单链表中删除*q结点*/ free(q); /*释放*q结点*/ return 1; } }