1.定义单链表的数据类型和变量
typedef char ElemType;
typedef struct LNode{ //链表结点
ElemType data; //数据域
struct LNode *next; //指针域(指向自身的指针)
} LinkList;
2.初始化链表
void InitList(LinkList *&L){//初始化链表
L=(LinkList *)malloc(sizeof(LinkList));//建立头结点
L->next=NULL;//建立空单链表L
}
3.使用尾插法
void CreateListR(LinkList *&L,ElemType a[],int n) {
LinkList *s,*rear;
int i;
L=(LinkList *)malloc(sizeof(LinkList)); //建立头结点
rear=L; //rear始终指向终端节点,开始时指向头结点
for(i=0; i<n; i++) {
s=(LinkList *)malloc(sizeof(LinkList)); //创建新结点
s->data=a[i]; //给新结点的data域赋值
rear->next=s; //尾结点的next域指向s,新结点插入表尾
rear=s; //尾结点指向s,尾指针指向新的表尾
}
r->next=NULL; //终端结点的next域置为NULL
}
4.使用头插法
//使用头插法
void CreateListF(LinkList *&L,ElemType a[],int n) {
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList)); //建立头结点
L->next=NULL;
for(i=0; i<n; i++) {
s=(LinkList *)malloc(sizeof(LinkList)); //创建新结点
s->data=a[i]; //给新结点的data域赋值
s->next=L->next; //新结点的next域指向头结点的next域
L->next=s; //头结点的next指向s
}
}
5.求长度
//求线性表的长度
int ListLength(LinkList *L) { //传一个头结点
int len=0;
LinkList *p=L; //定义一个链表指针,让p指向头结点
while(p->next!=NULL) {
len++;
p=p->next;
}
return len;
}
6.判断链表是否为空
//判断表是否为空
bool ListEmpty(LinkList *L){
return (L->next==NULL);
}
7.//删除链表结点
bool DeleteElem(LinkList *&L,int i,ElemType &e){
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
8.给第i个位置插入元素e
bool ListInsert(LinkList *&L,int i,ElemType e) {
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
9.求链表某个元素的值
char GetElem(LinkList *L,int i){
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) {
return false;
}
else{
char e;
e=p->data;
return e;
}
}
10.按元素值查找位置
int LocateElem(LinkList *L,ElemType e){
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL){
return (0);
}
else{
return (i);
}
}
11.销毁线性表
void DestoryList(LinkList *&L){
LinkList *pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);
printf("销毁成功\n ");
}
12.输出链表
void DisplayList(LinkList *L){
LinkList *p=L->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
测试代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
LinkList *L;
char s[5]= {'a','b','c','d','e'};
char e;
int i,j;
InitList(L);//初始化单链表
bool mark=ListEmpty(L);//判断链表是否为空
if(mark==true){
printf("链表不为空\n");
} else{
printf("链表为空\n");
}
CreateListR(L,s,5);//使用尾插法建立单链表
DisplayList(L);//输出单链表
int len=ListLength(L);
printf("%d\n",len);
ListInsert(L,2,'f');//给链表第二个结点插入'f'
DisplayList(L);//输出单链表
e=GetElem(L,3);
printf("第三个元素的值为%c\n",e);
j=LocateElem(L,'a');
printf("a的是第%d个元素\n",j);
//删除第二个结点
if(DeleteElem(L,2,e))
printf("删除成功\n");
DisplayList(L);
DestoryList(L);
return 0;
}
呼呼 单链表
完整代码
#include <stdio.h>
#include<stdlib.h>
typedef char ElemType;
//链表结点
typedef struct LNode{
ElemType data;
struct LNode *next;
} LinkList;
//初始化链表
void InitList(LinkList *&L){
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
//销毁线性表
void DestoryList(LinkList *&L){
LinkList *pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);
printf("销毁成功\n ");
}
//判断表是否为空
bool ListEmpty(LinkList *L){
return (L->next==NULL);
}
//输出链表
void DisplayList(LinkList *L){
LinkList *p=L->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
//使用头插法
void CreateListF(LinkList *&L,ElemType a[],int n) {
LinkList *s;
int i;
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;
L->next=s;
}
}
//使用尾插法
void CreateListR(LinkList *&L,ElemType a[],int n) {
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0; i<n; i++) {
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
//删除元素的值
bool DeleteElem(LinkList *&L,int i,ElemType &e){
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
//求线性表的长度
int ListLength(LinkList *L) {
int len=0;
LinkList *p=L;
while(p->next!=NULL) {
len++;
p=p->next;
}
return len;
}
//给第i个位置插入元素e
bool ListInsert(LinkList *&L,int i,ElemType e) {
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
//求链表某个元素的值
char GetElem(LinkList *L,int i){
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) {
return false;
}
else{
char e;
e=p->data;
return e;
}
}
//按元素值查找位置
int LocateElem(LinkList *L,ElemType e){
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL){
return (0);
}
else{
return (i);
}
}
int main(){
LinkList *L;
char s[5]= {'a','b','c','d','e'};
char e;
int i,j;
InitList(L);//初始化单链表
bool mark=ListEmpty(L);//判断链表是否为空
if(mark==true){
printf("链表不为空\n");
} else{
printf("链表为空\n");
}
CreateListR(L,s,5);//使用尾插法建立单链表
DisplayList(L);//输出单链表
int len=ListLength(L);
printf("%d\n",len);
ListInsert(L,2,'f');//给链表第二个结点插入'f'
DisplayList(L);//输出单链表
e=GetElem(L,3);
printf("第三个元素的值为%c\n",e);
j=LocateElem(L,'a');
printf("a的是第%d个元素\n",j);
//删除第二个结点
if(DeleteElem(L,2,e))
printf("删除成功\n");
DisplayList(L);
DestoryList(L);
return 0;
}