含头结点
创建链表
创建节点
遍历并打印所有节点
链表是否为空
头插法建立链表
尾插法建立链表
获取当前节点的下一个节点
删除值为data的节点
在值为m的节点后面插入值为data的节点
将值为m的节点的值改为data
#include
#include
#include
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkedList,*CLlist;
/*创建链表*/
CLlist CreatList()
{
CLlist L = (CLlist)malloc(sizeof(LinkedList));
L->data = -1; //指定一个特殊值,判断是否是头结点
L->next = L; //空链表的头结点使其下一个节点指向其本身,构成环
return L;
}
/*创建节点*/
CLlist CreatNode(ElemType data)
{
CLlist node = (CLlist)malloc(sizeof(LinkedList));
node->data = data;
node->next = node; //创建的节点使其自身构成环,在插入链表时再做更改
return node;
}
/*链表是否为空*/
int ListIsEmpty(CLlist L)
{
if(L->next == L)
{
return 1;
}
return 0;
}
/*遍历打印所有节点*/
void PrintList(CLlist L)
{
if(ListIsEmpty(L)==1)
{
printf("链表为空!\n");
return;
}
L=L->next;
while(L->data!=-1)
{
printf("%d-->",L->data);
L=L->next;
}
printf("\n");
}
/*头插法建立链表*/
void InsertNodeByHead(CLlist L,ElemType data)
{
CLlist newnode = CreatNode(data);
newnode->next = L->next;
L->next = newnode;
printf("节点-- %d --插入成功!\n",data);
}
/*尾插法建立链表*/
void InsertNodeByTail(CLlist L,ElemType data)
{
CLlist newnode = CreatNode(data);
//先取到链表的最后一个节点,当某个节点的下一个节点的值为-1时,说明当前节点为最后一个节点
while (L->next->data!=(-1))
{
L=L->next;
}
newnode->next = L->next;
L->next = newnode;
printf("节点-- %d --插入成功!\n",data);
}
/*获得值为data节点的下一个节点*/
void GetNext(CLlist L,ElemType data)
{
if(ListIsEmpty(L)==1)
{
printf("链表为空!\n");
return;
}
if(L->data==data)
{
printf("节点-- %d --为无效的头结点!\n",data);
return;
}
//当L不是尾节点时
while(L->next->data!=(-1))
{
if(L->data == data)
{
printf("-- %d --节点的下一个节点为-- %d --\n",data,L->next->data);
return;
}
L=L->next;
}
//L是尾节点时
if(L->data==data)
{
printf("节点-- %d --为最后一个节点!\n",data);
return;
}
printf("链表中无值为-- %d --的节点\n",data);
}
/*删除值为data的节点*/
void RemoveNode(CLlist L,ElemType data)
{
if(ListIsEmpty(L)==1)
{
printf("链表为空!\n");
return;
}
CLlist delnode = NULL;
if(L->next->data==data)
{
delnode = L->next;
L->next=delnode->next;
free(delnode);
printf("节点-- %d --删除成功!\n",data);
return;
}
L=L->next;
//当L不是最后一个节点时,执行循环
while(L->data!=(-1))
{
//查找L的下一个节点是否为要删除的节点,是就将L的next指针域赋值为要删除节点的下一个节点,即L节点的下一个节点的下一个节点
if(L->next->data==data)
{
delnode = L->next;//要删除的节点为L的下一个节点
L->next = delnode->next;
free(delnode);
printf("节点-- %d --删除成功!\n",data);
return;
}
L=L->next;
}
printf("链表中无值为-- %d --的节点\n",data);
}
/*在值为m的节点后面插入值为data节点*/
void InsertNode(CLlist L,ElemType m,ElemType data)
{
CLlist newnode = CreatNode(data);
L=L->next;
while(L->data!=(-1))
{
if(L->data == m) {
newnode->next = L->next;
L->next = newnode;
printf("节点-- %d --插入成功!\n",data);
return;
}
L=L->next;
}
printf("链表中无值为-- %d --的节点\n",m);
}
/*将值为m的节点的值改为data*/
void ChangeNode(CLlist L,ElemType m,ElemType data)
{
while(L->next->data!=(-1))
{
if(L->data == m)
{
L->data = data;
printf("节点更改成功!\n");
return;
}
L=L->next;
}
printf("链表中无值为-- %d --的节点\n",m);
}
int main() {
return 0;
}