单链表的基础操作

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;
}


猜你喜欢

转载自blog.csdn.net/qq_40959340/article/details/80807383
今日推荐