带头结点
创建链表
创建节点
判断链表是否为空
遍历打印链表
头插法建立链表
尾插法建立链表
删除节点
在指定节点后插入新的节点
改变某个节点的值
删除整个链表
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkList,*LList;
//创建链表
LList CreatList()
{
LList L = (LList)malloc(sizeof(LinkList));
L->data = -1; //指定一个特殊值,判断是否是头结点
L->next = NULL;
return L;
}
//创建节点
LList CreatNode(ElemType data)
{
LList node = (LList)malloc(sizeof(LinkList));
node->data = data;
node->next = NULL;
return node;
}
//判断链表是否为空
int ListIsEmpty(LList L)
{
if(L->next == NULL)
{
return 1;
}
return 0;
}
//打印链表
void PrintList(LList L)
{
if(ListIsEmpty(L))
{
printf("链表为空,无法打印!\n");
exit(0);
}
LList moveNode = L->next;
while(moveNode)
{
printf("%d->",moveNode->data);
moveNode=moveNode->next;
}
printf("\n");
}
//头插法建立链表
void InsertNodeByHead(LList L, ElemType data)
{
LList newnode = CreatNode(data);
newnode->next = L->next;
L->next = newnode;
printf("节点--%d--插入成功!\n",data);
}
//尾插发建立链表
void InsertNodeByTail(LList L,ElemType data)
{
LList newnode = CreatNode(data);
while(L->next!=NULL)
{
L=L->next;
}
L->next=newnode;
}
//删除数值为data的节点
void RemoveNode(LList L,ElemType data)
{
LList next=L->next;
LList delnode = NULL;
while(next!=NULL)
{
//if循环内执行删除操作,外执行while查找操作
if(next->data==data) {
printf("已找到此节点!\n");
delnode = next;
if (delnode->next != NULL) {
L->next = delnode->next;
} else {
L->next = NULL;
}
free(delnode);
printf("已删除此节点!\n");
return ;
}
next = next->next;
L=L->next;
}
printf("无此节点!\n");
}
//在数值为m的位置后插入数值为data节点
void InsertNode(LList L,ElemType m,ElemType data)
{
LList newnode = CreatNode(data);
while(L!= NULL)
{
if(L->next->data == m)
{
newnode->next = L->next->next;
L->next->next = newnode;
return;
}
L = L->next;
}
}
//将值为m的节点的值改为data
void ChangeData(LList L,ElemType m,ElemType data)
{
while(L!=NULL)
{
if(L->data == m)
{
L->data = data;
return;
}
L=L->next;
}
}
//删除链表
void DeleteList(LList L)
{
LList swap = L;
while(L->next!=NULL)
{
swap = L;
L=swap->next;
free(swap);
}
free(L);
printf("删除成功!\n");
}
int main()
{
return 0;
}