请为此创建一个主函数,并循环,每次循环问一遍用户所要做的操作
时间: 2024-09-12 10:02:25 浏览: 46
好的,我来为您编写一个主函数并实现您描述的功能。该程序会使用C语言,并且提供给用户几个基本的操作选项以管理单向链表,如创建、插入和删除节点等:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} ListNode;
typedef ListNode* LinkList;
LinkList CreatList() {
char ch;
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
ListNode* s, * r;
r = head;
while ((ch = getchar()) != '\n') {
s = (ListNode*)malloc(sizeof(ListNode));
s->data = ch;
r->next = s;
r = s;
}
r->next = NULL;
return head;
}
ListNode* GetNode(ListNode* head, int i) {
int j;
ListNode* p;
p = head; j = 0;
while (p->next && j < i) {
p = p->next; j++;
}
return (i == j)? p : NULL;
}
void InsertList(ListNode* head, int x, int i) {
ListNode* p = GetNode(head, i - 1);
if (!p)
fprintf(stderr, "Position error.\n");
else {
ListNode* s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
s->next = p->next;
p->next = s;
}
}
void DeleteList(ListNode* head, int i) {
ListNode* p = GetNode(head, i - 1);
if (!p || !p->next)
fprintf(stderr, "Position error.\n");
else {
ListNode* r = p->next;
p->next = r->next;
free(r);
}
}
void PrintList(LinkList head) {
for (ListNode* current = head->next; current; current = current->next) {
printf("%d ", current->data);
}
printf("\n");
}
int main() {
LinkList list = NULL;
while(1) {
printf("请输入操作: 1-创建链表, 2-插入元素, 3-删除元素, 4-打印链表, 5-退出:\n");
int choice;
scanf("%d", &choice);
switch(choice) {
case 1:
if(list) free(list);
list = CreatList();
break;
case 2:
int insertData, position;
printf("请输入插入位置和数据:\n");
scanf("%d %d", &position, &insertData);
InsertList(list, insertData, position);
break;
case 3:
int deletePosition;
printf("请输入删除的位置:\n");
scanf("%d", &deletePosition);
DeleteList(list, deletePosition);
break;
case 4:
if(!list) {
printf("链表为空。\n");
} else {
PrintList(list);
}
break;
case 5:
if(list) free(list);
return 0;
default:
printf("无效的选择,请重新选择。\n");
}
}
return 0;
}
```
请注意,在实际运行时你需要处理好内存释放的问题,避免内存泄漏。另外,`ERROR` 函数被替换成了 `fprintf` 输出到标准错误流,因为直接使用字符串"ERROR"未被定义。如果你有特定的方式输出错误信息,可以自行调整这部分代码。
阅读全文