单链表
一.节点结构体定义
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode * next;
}*LinkList,LinkNode;
二.带有头结点的单链表
1.创建一个单链表
LinkList create(){
LinkList L = (LinkList)malloc(sizeof(LinkNode));
if(L == NULL){
printf("error!\n");
exit(-1);
}
L->next = NULL;
return L;
}
2.遍历一个单链表
void print(LinkList L){
LinkList p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
}
3.创建一个节点
LinkNode *createNode(ElemType data){
LinkNode * LN = (LinkNode*)malloc(sizeof(LinkNode));
if(LN == NULL){
printf("error!\n");
exit(-1);
}
LN->data = e;
return LN;
}
4.插入数据
1.头插法
void insertByHead(LinkList L,ElemType e){
LinkNode * LN = createNode(e);
LN->next = L->next;
L->next = LN;
}
2.尾插法
void insertByEnd(LinkList L,ElemType e){
LinkNode *p = L->next;
while(p->next){p = p->next;}
LinkNode *LN = createNode(e);
p->next = LN;]
LN->next = NULL;
}
4.删除节点
void deletNodeBydata(LinkList L,ElemType e){
LinkNode *p = L;
LinkNode *ptr = L->next;
while(ptr){
if(ptr->data == e){
p->next = ptr->next;
free(ptr);
return;
}
p = ptr;
ptr = ptr ->next;
}
}
5.删除链表
void deletList(LinkList L) {
LinkNode *p = L->next;
LinkNode *temp;
while (p) {
temp = p->next;
free(p);
p = temp;
}
L->next = NULL;
}
三.没有头结点的单链表
四.完整代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode * next;
}*LinkList,LinkNode;
// 创建一个链表
LinkList create(){
LinkList L = (LinkList)malloc(sizeof(LinkNode));
if(L == NULL){
printf("error!\n");
exit(-1);
}
L->next = NULL;
return L;
}
int is_empty(LinkList L){
return L->next == NULL;
}
// 便利链表
void print(LinkList L){
LinkList p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//创建一个节点
LinkNode *createNode(ElemType e){
LinkNode * LN = (LinkNode*)malloc(sizeof(LinkNode));
if(LN == NULL){
printf("error!\n");
exit(-1);
}
LN->data = e;
return LN;
}
// 头插法
void insertByHead(LinkList L,ElemType e){
LinkNode * LN = createNode(e);
LN->next = L->next;
L->next = LN;
}
// 尾插法
void insertByEnd(LinkList L,ElemType e){
LinkNode *p = L->next;
while(p->next){p = p->next;}
LinkNode *LN = createNode(e);
p->next = LN;
LN->next = NULL;
}
// 删除元素通过元素值
void deleteNodeBydata(LinkList L,ElemType e){
LinkNode *p = L;
LinkNode *ptr = L->next;
while(ptr){
if(ptr->data == e){
p->next = ptr->next;
free(ptr);
return;
}
p = ptr;
ptr = ptr ->next;
}
}
void deletList(LinkList L) {
LinkNode *p = L->next;
LinkNode *temp;
while (p) {
temp = p->next;
free(p);
p = temp;
}
L->next = NULL;
}
int main(){
// 创建一个链表
LinkList L = create();
insertByHead(L,1);
insertByHead(L,2);
insertByHead(L,3);
insertByEnd(L,190);
deleteNodeBydata(L,1);
print(L);
deletList(L);
printf("%d\n",is_empty(L));
return 0;
}