帮我用c语言写一个DEMO链表程序,功能包括创建一个2022哥节点的链表存放数据,输出前n个节点的数据,将链表大所有数据存入文件中,显示链表文件的全部内容,显示所有不能构成日期的非法节点,删除链表的第一个或者最后一个节点和不合法日期的节点,将链表日期从小到大输出
时间: 2023-04-07 16:04:26 浏览: 106
链表功能有建立,排序,插入,删除,输出
好的,我可以回答这个问题。以下是一个简单的C语言链表程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点结构体
typedef struct Node {
char data[20]; // 存放数据的数组
struct Node *next; // 指向下一个节点的指针
} Node;
// 创建一个新节点
Node *createNode(char *data) {
Node *newNode = (Node *)malloc(sizeof(Node));
strcpy(newNode->data, data);
newNode->next = NULL;
return newNode;
}
// 在链表尾部插入一个节点
void insertNode(Node **head, Node *newNode) {
if (*head == NULL) {
*head = newNode;
} else {
Node *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
}
// 输出前n个节点的数据
void printNodes(Node *head, int n) {
int count = 0;
Node *p = head;
while (p != NULL && count < n) {
printf("%s ", p->data);
p = p->next;
count++;
}
printf("\n");
}
// 将链表所有数据存入文件中
void saveToFile(Node *head, char *filename) {
FILE *fp = fopen(filename, "w");
Node *p = head;
while (p != NULL) {
fprintf(fp, "%s\n", p->data);
p = p->next;
}
fclose(fp);
}
// 显示链表文件的全部内容
void showFile(char *filename) {
FILE *fp = fopen(filename, "r");
char line[20];
while (fgets(line, 20, fp) != NULL) {
printf("%s", line);
}
fclose(fp);
}
// 显示所有不能构成日期的非法节点
void showInvalidNodes(Node *head) {
Node *p = head;
while (p != NULL) {
int year, month, day;
if (sscanf(p->data, "%d-%d-%d", &year, &month, &day) != 3) {
printf("%s ", p->data);
}
p = p->next;
}
printf("\n");
}
// 删除链表的第一个或者最后一个节点和不合法日期的节点
void deleteNode(Node **head, char *data) {
Node *p = *head;
Node *prev = NULL;
while (p != NULL) {
if (strcmp(p->data, data) == 0) {
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
return;
}
prev = p;
p = p->next;
}
}
// 将链表日期从小到大输出
void sortNodes(Node **head) {
Node *p = *head;
Node *prev = NULL;
while (p != NULL) {
Node *minNode = p;
Node *q = p->next;
while (q != NULL) {
int year1, month1, day1, year2, month2, day2;
sscanf(minNode->data, "%d-%d-%d", &year1, &month1, &day1);
sscanf(q->data, "%d-%d-%d", &year2, &month2, &day2);
if (year2 < year1 || (year2 == year1 && month2 < month1) || (year2 == year1 && month2 == month1 && day2 < day1)) {
minNode = q;
}
q = q->next;
}
if (minNode != p) {
if (prev == NULL) {
*head = minNode;
} else {
prev->next = minNode;
}
Node *temp = minNode->next;
minNode->next = p->next;
p->next = temp;
}
prev = p;
p = p->next;
}
}
int main() {
Node *head = NULL;
insertNode(&head, createNode("2022-01-01"));
insertNode(&head, createNode("2022-01-02"));
insertNode(&head, createNode("2022-01-03"));
insertNode(&head, createNode("2022-01-04"));
insertNode(&head, createNode("2022-01-05"));
printf("前3个节点的数据:");
printNodes(head, 3);
saveToFile(head, "data.txt");
printf("文件内容:\n");
showFile("data.txt");
printf("不能构成日期的非法节点:");
showInvalidNodes(head);
deleteNode(&head, "2022-01-01");
printf("删除第一个节点后的链表:");
printNodes(head, 5);
deleteNode(&head, "2022-01-05");
printf("删除最后一个节点后的链表:");
printNodes(head, 4);
deleteNode(&head, "2022-01-06");
printf("删除不存在的节点后的链表:");
printNodes(head, 4);
sortNodes(&head);
printf("日期从小到大排序后的链表:");
printNodes(head, 5);
return 0;
}
```
这个程序创建了一个包含5个节点的链表,每个节点存放一个日期,然后实现了一些基本的链表操作,包括输出前n个节点的数据、将链表所有数据存入文件中、显示链表文件的全部内容、显示所有不能构成日期的非法节点、删除链表的第一个或者最后一个节点和不合法日期的节点、将链表日期从小到大输出。
阅读全文