非循环单链表插入结点伪算法讲解
q插入p之后的伪算法:
第一种表示方法:
r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址
p->pNext = q; // q保存了那一块结点的地址。q是一个指针变量,存放那个结点的地址。
q->pNext = r;
第二种表示方法:
q->pNext = p->pNext; // q的指针域指向p后面一个结点
p->pNext = q; // p的指针域指向q
删除非循环单链表结点伪算法:
把p后面的一个结点删除掉
r = p->pNext;
p->pNext = p->pNext->pNext;
free(r); // 释放内存
链表创建和链表遍历算法的演示:
创建一个单链表,然后遍历。
#include <stdio.h> #include <malloc.h> #include <stdlib.h> /* 创建一个单链表,然后遍历。 */ typedef struct Node { int data; // 数据域 struct Node *pNext; // 指针域 }NODE, *PNODE; // NODE等价于struct Node, PNODE等价于struct Node * // 函数声明 PNODE create_list(void); void traverse_list(PNODE pHead); int main(void) { PNODE pHead = NULL; // 等价于 struct Node *pHead = NULL; pHead = create_list(); // 创建一个非循环单链表,并将该链表的头结点的地址赋值给pHead // 遍历单链表 traverse_list(pHead); return 0; } /* 创建一个非循环单链表, 返回该单链表头节点的地址 */ PNODE create_list(void) { int len; // 用来存放有效结点的个数 int i; int val; // 用来临时存放用户输入的结点的值 // 分配一个不存放有效数据的头结点 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(pHead == NULL) { printf("内存分配失败,程序终止!"); exit(-1); } // pTail代表尾结点,指针域为NULL PNODE pTail = pHead; pTail->pNext = NULL; printf("请输入您需要生成的单链表结点的个数: len ="); scanf("%d", &len); for(i = 0;i < len;i++) { printf("请输入第%d个结点的值:\n", i + 1); scanf("%d", &val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(pNew == NULL) { printf("内存分配失败,程序终止!"); exit(-1); } pNew->data = val; // 把新生成的结点挂到pNext指针域上 // pTail代表最后一个结点,指针域为NULL pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } // 遍历单链表 void traverse_list(PNODE pHead) { PNODE p = pHead->pNext; // 如果p不为空,表明p已经指向一个结点了, // 如果p为空,表明单链表为空,指向的是空的头结点 while(p != NULL) { printf("%d", p->data); p = p->pNext; // p往后移 } }