结构体变量分为数据域和指针域
结构体变量和数组变量一样都是由大到小开始分配存储单元
0FFFF | Node1 | |
1 | 0FFF0 | |
0FFF0 | Node2 | |
2 | 0FF00 | |
0FF00 | Node3 | |
3 | NULL |
静态链表
动态链表
①创建一个表头去表示整个链表
struct Node *creatListHead()
{
//1.赋值结构体变量
//2.动态内存申请
struct Node *ListHead=(struct Node *)malloc(sizeof(struct Node));
//为结构体变量初始化
//差异化处理,表头不使用数据
ListHead->next=NULL;
return ListHead;
}
②创建节点:为插入做准备
struct Node *creatNewNode(int data)
{
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
③链表的插入
(1)链表表头的插入
//4.链表的插入:
void insertNodeByHead(struct Node *listHeadNode,int data)
{
struct Node *newNode=creatNewNode(data);
newNode->next=listHeadNode->next;
listHeadNode->next=newNode;
}
(2)链表表尾的插入
//5.表尾插入
void insertNodeByTail(struct Node *listHeadNode,int data)
{
struct Node *newNode=creatNewNode(data);
//找到表尾
struct Node *tailNode=listHeadNode;
while(tailNode->next == NULL)
{
tailNode = tailNode->next;
}
tailNode->next=newNode;
}
(3)指定位置插入
void insertNodeByAppion(struct Node *listHeadNode,int data,int posData)
{
struct Node *posNodeFront=listHeadNode;
struct Node *posNode=listHeadNode->next; //指定位置前面的节点
if(posNode==NULL)
{
printf("链表为空!");
system("pause");
return;
}
else
{
while(posNode->data!=posData)
{
posNodeFront=posNode;
posNode=posNode->next;
if(posNode==NULL)
{
printf("未找到相关信息!");
system("pause");
return;
}
}
struct Node *newNode=creatNewNode(data);
newNode->next=posNode;
posNodeFront->next=newNode;
}
}
④链表的打印
void printfList(struct Node *ListHeadNode)
{
struct Node *pMove=ListHeadNode->next;
while(pMove!=NULL)
{
printf("%d\t",pMove->data);
pMove=pMove->next;
}
printf("\n");
}
⑤链表的删除
(1)表头的删除
//表头法的删除
void deleteNodeByhead(struct Node *listHeadNode)
{
struct Node *deleteNode=listHeadNode->next;
listHeadNode->next=deleteNode->next;
free(deleteNode);
}
(2)表尾删除
//表尾删除
void deleteNodeByTail(struct Node *listHeadNode)
{
//找到表尾
struct Node *tailNode = listHeadNode;
//定义表尾的前一个节点
struct Node *tailNodeFront = NULL;
while(tailNode->next!=NULL)
{
tailNodeFront=tailNode;
tailNode=tailNode->next;
}
free(tailNode);
//处理断掉的尾巴
tailNode =NULL;
tailNodeFront=NULL;
}
(3)指定位置删除
//指定位置删除
void deleteNodeByAppoin(struct Node *listHeadNode,int posData)
{
struct Node *posNodeFront=listHeadNode;
struct Node *posNode=listHeadNode->next; //指定位置前面的节点
if(posNode==NULL)
{
printf("链表为空!");
system("pause");
return;
}
else
{
while(posNode->data!=posData)
{
posNodeFront=posNode;
posNode=posNode->next;
if(posNode==NULL)
{
printf("未找到相关信息!");
system("pause");
return;
}
}
posNodeFront->next=posNode->next;
free(posNode);
posNode=NULL;
}
}
总代码如下:
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data; //int 类型的数据分析
struct Node * next; //结构体指针
};
//1.创建一个表头去表示整个链表
struct Node *creatListHead()
{
//链表的基本单元:就是结构体变量
//结构体指针怎么结构体变量
//1.赋值结构体变量
//2.动态内存申请
struct Node *ListHead=(struct Node *)malloc(sizeof(struct Node));
//为结构体变量初始化
//差异化处理,表头不使用数据
ListHead->next=NULL;
return ListHead;
}
//2.创建节点:为插入做准备
struct Node *creatNewNode(int data)
{
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
void printfList(struct Node *ListHeadNode)
{
struct Node *pMove=ListHeadNode->next;
while(pMove!=NULL)
{
printf("%d\t",pMove->data);
pMove=pMove->next;
}
printf("\n");
}
//4.链表的插入:
void insertNodeByHead(struct Node *listHeadNode,int data)
{
struct Node *newNode=creatNewNode(data);
newNode->next=listHeadNode->next;
listHeadNode->next=newNode;
}
//5.表尾插入
void insertNodeByTail(struct Node *listHeadNode,int data)
{
struct Node *newNode=creatNewNode(data);
//找到表尾
struct Node *tailNode=listHeadNode;
while(tailNode->next == NULL)
{
tailNode = tailNode->next;
}
tailNode->next=newNode;
}
void insertNodeByAppion(struct Node *listHeadNode,int data,int posData)
{
struct Node *posNodeFront=listHeadNode;
struct Node *posNode=listHeadNode->next; //指定位置前面的节点
if(posNode==NULL)
{
printf("链表为空!");
system("pause");
return;
}
else
{
while(posNode->data!=posData)
{
posNodeFront=posNode;
posNode=posNode->next;
if(posNode==NULL)
{
printf("未找到相关信息!");
system("pause");
return;
}
}
struct Node *newNode=creatNewNode(data);
newNode->next=posNode;
posNodeFront->next=newNode;
}
}
//表头法的删除
void deleteNodeByhead(struct Node *listHeadNode)
{
struct Node *deleteNode=listHeadNode->next;
listHeadNode->next=deleteNode->next;
free(deleteNode);
}
//表尾删除
void deleteNodeByTail(struct Node *listHeadNode)
{
//找到表尾
struct Node *tailNode = listHeadNode;
//定义表尾的前一个节点
struct Node *tailNodeFront = NULL;
while(tailNode->next!=NULL)
{
tailNodeFront=tailNode;
tailNode=tailNode->next;
}
free(tailNode);
//处理断掉的尾巴
tailNode =NULL;
tailNodeFront=NULL;
}
//指定位置删除
void deleteNodeByAppoin(struct Node *listHeadNode,int posData)
{
struct Node *posNodeFront=listHeadNode;
struct Node *posNode=listHeadNode->next; //指定位置前面的节点
if(posNode==NULL)
{
printf("链表为空!");
system("pause");
return;
}
else
{
while(posNode->data!=posData)
{
posNodeFront=posNode;
posNode=posNode->next;
if(posNode==NULL)
{
printf("未找到相关信息!");
system("pause");
return;
}
}
posNodeFront->next=posNode->next;
free(posNode);
posNode=NULL;
}
}
int main()
{
struct Node *headNode=creatListHead();
printf("表头法插入:\n");
insertNodeByHead(headNode,1);
insertNodeByHead(headNode,2);
insertNodeByHead(headNode,3);
insertNodeByHead(headNode,5);
printfList(headNode);
printf("表尾法插入:\n");
insertNodeByTail(headNode,0);
printfList(headNode);
printf("指定位置插入:\n");
insertNodeByAppion(headNode,7,3);
printfList(headNode);
printf("表头删除:\n");
deleteNodeByhead(headNode);
printfList(headNode);
printf("表尾法删除:\n");
deleteNodeByTail(headNode);
printfList(headNode);
printf("指定位置删除:\n");
deleteNodeByAppoin(headNode,2);
printfList(headNode);
system("pause");
return 0;
}