上传文件至 ''

This commit is contained in:
xtaodada 2022-03-16 23:42:04 -04:00
parent b98141efb5
commit 8ffc6b0c24

247
ex2_2.c Normal file
View File

@ -0,0 +1,247 @@
#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;
};