题解 | #【模板】链表#
【模板】链表
https://www.nowcoder.com/practice/97dc1ac2311046618fd19960041e3c6f
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//创建链表头节点
typedef int DataType;
typedef struct linknode { /*单链表存储类型*/
DataType data; /*定义结点的数据域*/
struct linknode* Next; /*定义结点的指针域*/
} LinkList;
LinkList* InitList() {
/*初始化链表函数*/
LinkList* head;
head = (LinkList*)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
head->Next = NULL;
return head; /*头结点L指针域为空,表示空链表*/
}
void CreateListL(LinkList* head, int n) {
/*建立链表函数*/
LinkList* s;
s = (LinkList*) malloc(sizeof(LinkList)); /*生成新结点*/
s->data = n;
s->Next = NULL; /*将新结点的指针域为空*/
head->Next = s;
}
//插入操作
void Insert(LinkList* head, int target, int value) {
//把p 指向头节点遍历
LinkList* p = head;
//插入的数分配内存空间
LinkList* NewCode = (LinkList*) malloc(sizeof(LinkList));
NewCode->data = value;
NewCode->Next = NULL;
//链表为空直接返回
if (p->Next == NULL) {
CreateListL(p, value);
} else {
//确保p还没有遍历到链表尾,找到要插入元素的位置
while ( p->Next != NULL && p->Next->data != target) {
p = p->Next;
}
//找到了要插入的元素
if (p->Next != NULL) {
//插入元素
NewCode->Next = p->Next;
p->Next = NewCode;//放入前面
//未找到元素
} else {
p->Next = NewCode;//链表尾
}
}
}
LinkList* Delete(LinkList* head, int value) {
LinkList* p = head;
if (head == NULL) {
return NULL;
}
while (p->Next != NULL && p->Next->data != value) {
p = p->Next;
}
if (p->Next != NULL) {
LinkList* temp = p->Next;
p->Next = temp->Next;
free(temp);
}
return head;
}
//将链表元素输出
void printLinkedList(LinkList* head) {
//判断是否为空
//头指针的Next指针为空,表示整个链表为空,无法进行遍历和输出操作
if (head->Next == NULL) {
printf("NULL");
return;
}
LinkList* p = head;
p = p->Next;
while (p != NULL) {
printf("%d ", p->data);
p = p->Next;
}
}
int main() {
LinkList* head;
head = InitList();
int target, value, data;
int x, i; //操作次数
char ch[100000];
scanf("%d", &x);
for (i = 0; i < x; i++) {
scanf("%s", ch);
if (strcmp(ch, "insert") == 0) {
scanf("%d", &target);
scanf("%d", &value);
Insert( head, target, value);
} else if (strcmp(ch, "delete") == 0) {
scanf("%d", &data);
//更新头指针
head = Delete(head, data);
}
}
printLinkedList(head);
return 0;
}
