前两天面试,被链表干懵了,所以决定好好总结一下。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//定义链表中的复合数据域
typedef struct Student {
char name[20];
int num;
int math;
}student;
/* 节点定义:声明了一个结构体类型 LinkList
* 提示:由于指针域中的指针要指向的也是一个节点,因此要声明为 Link 类型(这里要写成 struct Link* 的形式)。
* 否则编译器会报错
*/
typedef struct Node {
int data; //代表数据域,数据域可能不止一个,或者可以使用复合类型的数据域
struct Node* next;
}LinkList;
//创建头结点
LinkList* createList()
{
LinkList* head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
head->data = 0;
return head;
}
/* 创建普通节点
* data 表示该节点存储的数据,如果有多个数据,则多加参数即可
*/
LinkList* createNode(int data)
{
LinkList* newNode = (LinkList*)malloc(sizeof(LinkList));
newNode->next = NULL;
newNode->data = data;
return newNode;
}
/* 插入节点,头插法:即从头结点开始往后插入,每次改变头结点指向的指针
* head: 传入头结点
* data: 要插入的数据
*/
void insertNodeByhead(LinkList* head, int data)
{
LinkList* newNode = createNode(data);
newNode->next = head->next;
head->next = newNode;
}
/* 插入节点,尾插法: 从尾结点开始插入
head: 每次都传入头结点,然后遍历到尾结点
*/
void insertNodeBytail(LinkList* head, int data)
{
LinkList* newNode = createNode(data);
while (head->next != NULL) {
head = head->next;
}
LinkList* tail = head;
newNode->data = data;
tail->next = newNode;
tail = newNode;
tail->next = NULL;
}
/* 插入节点,随机插入节点
* head: 表示链表头结点
* elem: 表示新数据的元素
* add: 表示新元素要插入的位置
*/
void insertNode(LinkList* head, int elem, int add)
{
LinkList* temp = head;
for (int i = 1; i < add; i++) {
temp = temp->next;
if (temp == NULL) {
printf("插入位置无效");
}
}
LinkList* newNode = createNode(elem);
newNode->next = temp->next;
temp->next = newNode;
}
/* 链表删除,删除指定节点
postData: 删除数值为k的节点
*/
void deleteNodeByAppoin(LinkList* headNode, int postData)
{
LinkList* postNode = headNode->next; //从头结点开始遍历
LinkList* postNodeFront = headNode;
if (postNode == NULL) {
printf("无法删除 链表为空\n");
}
else {
while (postNode->data != postData) {
postNodeFront = postNode; //将前一个节点移到当前节点
postNode = postNodeFront->next; //将当前节点往后一个
if (postNode == NULL) {
printf("没有找到相关信息,无法删除\n");
return;
}
}
postNodeFront->next = postNode->next;
free(postNode); //删除节点后,释放该节点的内存空间
}
}
/* 查找节点
* head: 链表头结点
* elem: 待查找元素
*/
int selectElem(LinkList* head, int elem)
{
LinkList* temp = head;
int i = 1;
while (temp->next) {
temp = temp->next;
if (temp->data == elem) {
return i;
}
i++;
}
return -1;
}
/* 更新节点
*
*/
void
/* 打印链表
*/
//打印链表
void printList(LinkList* head)
{
LinkList* pmove = head->next;
while (pmove) {
printf("%d \t", pmove->data);
pmove = pmove->next;
}
printf("\n");
}
int main()
{
LinkList* list = createList();
insertNodeBytail(list, 1);
insertNodeBytail(list, 2);
insertNodeBytail(list, 3);
printList(list);
//deleteNodeByAppoin(list, 2);
//printList(list);
insertNode(list, 4, 4);
printList(list);
return 0;
}