上传文件至 ''
This commit is contained in:
parent
b98141efb5
commit
8ffc6b0c24
247
ex2_2.c
Normal file
247
ex2_2.c
Normal 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;
|
||||
};
|
Loading…
Reference in New Issue
Block a user