上传文件至 ''
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