结构体变量分为数据域和指针域
结构体变量和数组变量一样都是由大到小开始分配存储单元
| 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("%dt",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#include 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("%dt",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; }



