单链表的基本操作
1、头插法建立单链表
2、尾插法建立单链表
3、按序号查找结点值
4、按值查找表结点
5、插入结点操作
6、删除结点操作
7、打印单链表
8、销毁单链表
LNode.h
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//1、头插法建立单链表
LinkList List_HeadInsert(LinkList &L);
//2、尾插法建立单链表
LinkList List_TailInsert(LinkList &L);
//3、按序号查找结点值
LNode *GetElem(LinkList L,int i);
//4、按值查找表结点
LNode *LocateElem(LinkList L,ElemType e);
//5、插入结点操作
LinkList InsertNode(LinkList &L,ElemType e,int i);
//6、删除结点操作
LinkList DeleteNode(LinkList &L,int i);
//7、打印单链表
void PrintLNode(LinkList L);
//8、销毁单链表
void DestroyList(LinkList &L);
LNode.cpp
#include "LNode.h"
#include "stdlib.h"
#include<iostream>
/*//1、头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
LNode* s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创立头结点
L->next=NULL;//初始化为空链表
printf("请输入结点元素:\n");
scanf("%d",&x);
while(x>0){//当输入值小于0表示结束
s=(LNode*)malloc(sizeof(LNode));//生成新结点
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}*/
//2、尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));//创立头结点
L->next=NULL;//初始化为空链表
LNode* r=L;//r为表尾指针
printf("请输入结点元素:\n");
scanf("%d",&x);
while(x>0){//当输入值小于0表示结束
LNode *s=(LNode*)malloc(sizeof(LNode));//生成新结点
s->data=x;
r->next=s;
r=s;//r指向新的表尾指针
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//3、按序号查找结点值
LNode *GetElem(LinkList L,int i){
int j=1;
LNode* p=L->next;
if(i==0)return L;
if(i<1)return NULL;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//4、按值查找表结点
LNode *LocateElem(LinkList L,ElemType e){
LNode* p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
//5、插入结点操作
LinkList InsertNode(LinkList &L,ElemType e,int i){
LNode *p=GetElem(L,i-1);
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return L;
}
//6、删除结点操作
LinkList DeleteNode(LinkList &L,int i){
LNode *p=GetElem(L,i-1);
LNode *q=p->next;
p->next=q->next;
free(q);
return L;
}
//7、打印单链表
void PrintLNode(LinkList L){
LNode* p=L->next;
int count;
if(p==NULL) printf("此单链表为空");
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
count++;
}
printf("\n");
printf("表长为: %d\n",count);
}
//8、销毁单链表
void DestroyList(LinkList &L){
LinkList p;
while(L){
p=L->next;
//先销毁了链表的头,然后销毁后面的结点
free(L);
L=p;
}
if(L==NULL)printf("已销毁!");
}
LNode_main.cpp
#include <iostream>
using namespace std;
#include "LNode.h"
int main(int argc, char** argv) {
LinkList L;
/* //1、头插法建立单链表
List_HeadInsert(L);
PrintLNode(L);*/
//2、尾插法建立单链表
List_TailInsert(L);
printf("单链表为:");
PrintLNode(L);
//3、按序号查找结点值
int i;
printf("请输入需要查找的序号:");
scanf("%d",&i);
LNode *p=GetElem(L,i);
printf("按序号%d查找结点值: %d\n",i,p->data);
//4、按值查找表结点
int e;
printf("请输入需要查找的结点值:");
scanf("%d",&e);
printf("按值查找表结点: %d\n",LocateElem(L,e)->data);
//5、插入结点操作
InsertNode(L,e,i);
printf("插入节点后单链表为:");
PrintLNode(L);
//6、删除结点操作
DeleteNode(L,i);
printf("删除节点后单链表为:");
PrintLNode(L);
DestroyList(L);
return 0;
}