A-C/ex2_2.c
2022-03-16 23:42:04 -04:00

248 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define MAX 100
typedef int DataType;
typedef struct node{
DataType data;
struct node *next;
}Node;
void CreateListHead(Node *L, int n){
Node *p;
L->next = NULL;
for(int i = 0; i < n; i++){
// 创建结点 p
p = (Node *)malloc(sizeof(Node));
printf("请输入第 %d 个元素:",i+1);
scanf("%d",&(p->data));
// 插入
p->next = L->next;
L->next = p;
}
};
void CreateListEnd(Node *L, int n){
Node *p,*end=L;
for(int i=0;i<n;i++){
// 创建节点 p
p = (Node *)malloc(sizeof(Node));
printf("请输入第 %d 个元素:",i+1);
scanf("%d",&(p->data));
// 插入
end->next = p;
end = p;
}
end->next = NULL;
};
void insertList(Node *L, int n, DataType e){
Node *p=L;
// 首先找到要插入位置的上一个结点
for (int i=1; i<n; i++) {
if (p==NULL) {
printf("插入位置无效\n");
return;
}
p=p->next;
}
// 创建插入结点 new
Node *new=(Node*)malloc(sizeof(Node));
new->data=e;
// 向链表中插入结点
new->next=p->next;
p->next=new;
};
void EditList(Node *L, int n){
Node *p=L->next;
DataType e;
// 首先找到要修改的位置
for (int i=1; i<n; i++) {
if (p==NULL) {
printf("位置无效\n");
return;
}
p=p->next;
}
printf("请输入修改后的值:");
scanf("%d",&e);
p->data=e;
printf("修改完成。\n");
}
int FindList(Node *L, DataType e){
Node *p = L->next;
int i=0;
while(p != NULL){
if(p->data == e){
return i;
}
i++;
p = p->next;
}
return -1;
};
int DeleteList1(Node *L, DataType e){
Node *p = L->next, *last = L;
while(p != NULL){
if(p->data == e){
// 删除
last->next = p->next;
// 释放空间
free(p);
return 1;
}
last = last->next;
p = p->next;
}
return 0;
}
int DeleteList2(Node *L, int n){
Node *p = L->next, *last = L;
int i=0;
while(p != NULL){
if(i == n){
// 删除
last->next = p->next;
// 释放空间
free(p);
return 1;
}
last = last->next;
p = p->next;
i++;
}
return 0;
}
void DeleteList3(Node *L, DataType start, DataType end){
// 确认 start <= end
int temp;
if(start>end){
temp=end;
end=start;
start=temp;
}
Node *p = L->next, *last = L, *temp_;
while(p != NULL){
if(p->data < start){
last = last->next;
p = p->next;
}
if(p->data >= start || p->data <= end){
last->next = NULL;
// 释放空间
temp_=p;
p = p->next;
free(temp_);
}
if(p->data > end){
// 改变指针
last->next = p;
p = p->next;
}
}
};
void OutputList(Node *L){
Node *p = L->next;
while(p != NULL){
printf("%d\n", p->data);
p = p->next;
}
};
int main(){
Node *L1;
L1 = (Node *)malloc(sizeof(Node));
int n,choice,x,y;
DataType e;
for(;;){
printf("\t\t1.头插法输入链表\n");
printf("\t\t2.尾插法输入链表\n");
printf("\t\t3.在链表中插入元素\n");
printf("\t\t4.查找元素是否存在于单链表\n");
printf("\t\t5.删除指定值的元素\n");
printf("\t\t6.删除指定位置的元素\n");
printf("\t\t7.删除位于区间的元素\n");
printf("\t\t8.修改指定位置的元素\n");
printf("\t\t9.输出线性表\n");
printf("\t\t0.退出\n");
printf("请选择:");
scanf("%d",&choice);
if(choice==0) break;
switch (choice) {
case 1:
printf("请输入链表长度:");
scanf("%d",&n);
CreateListHead(L1, n);
OutputList(L1);
break;
case 2:
printf("请输入链表长度:");
scanf("%d",&n);
CreateListEnd(L1, n);
OutputList(L1);
break;
case 3:
printf("请输入需要插入的位置:");
scanf("%d",&n);
printf("请输入需要插入的元素:");
scanf("%d",&e);
insertList(L1,n,e);
OutputList(L1);
break;
case 4:
printf("请输入需要查找的元素:");
scanf("%d",&e);
n=FindList(L1,e);
if(n>-1){
printf("该元素在 %d\n",n);
} else {
printf("未找到该元素\n");
}
break;
case 5:
printf("请输入需要删除的元素的值:");
scanf("%d",&e);
n=DeleteList1(L1,e);
if(n==0){
printf("删除失败,元素不存在。\n");
} else {
printf("删除成功\n");
}
OutputList(L1);
break;
case 6:
printf("请输入需要删除的元素的位置:");
scanf("%d",&n);
n=DeleteList2(L1,n-1);
if(n==0){
printf("删除失败,位置不存在。\n");
} else {
printf("删除成功\n");
}
OutputList(L1);
break;
case 7:
printf("请输入需要删除的元素值区间 x y");
scanf("%d %d",&x,&y);
DeleteList3(L1,x,y);
printf("操作成功\n");
OutputList(L1);
break;
case 8:
printf("请输入需要修改的元素的位置:");
scanf("%d",&n);
EditList(L1,n);
OutputList(L1);
break;
case 9:
OutputList(L1);
break;
default:
break;
}
printf("请按任意键继续...");
getch();
system("cls");
}
printf("感谢使用,再见\n");
return 0;
};