//单链表(不带头结点)的一些基本操作
#include<stdio.h>
#include<stdlib.h>
//创建单链表
typedef struct listnode{
int data; //数据域
struct listnode* next; //指针域
}listNode,* linkList;
//初始化
void initialist(linkList &L){
L = NULL;
printf("初始化完毕!\n");
}
//判断初始化是否成功
bool judge(linkList &L){
if(L == NULL){
printf("初始化成功!\n");
return true;
}
else{
printf("初始化失败!\n");
return false;
}
}
//长度
int getLength(linkList &L){
int len;
listNode* N;
N = L;
len = 0;
while(N != NULL){
len++;
N = N->next;
}
return len;
}
//输出
void printlist(linkList &L){
int i;
listNode* N;
N = L;
while(N != NULL){
if(N->next == NULL){
printf("%d\n",N->data);
}
else{
printf("%d ",N->data);
}
N = N->next;
}
printf("单链表内容输出完毕!\n");
printf("其长度是%d\n",getLength(L));
}
//创建链表(头插法)
void setlinkList(linkList &L){
int ele;
listNode* N;
printf("请输入你想要的元素大小(除-1外):\n");
scanf("%d",&ele);
while(ele != -1){
N = (listNode*)malloc(sizeof(listNode));
N->data = ele;
N->next = L;
L = N;
printf("%d已进入此链表中!\n",ele);
printf("结束创建请输入-1\n");
scanf("%d",&ele);
}
printf("单链表建立完毕!(头插法)\n");
printlist(L);
}
//创建链表(尾插法)
void setListrear(linkList &L){
int ele,i;
listNode* N;
listNode* P;
i = 0;
printf("请输入你要的元素大小(除数字-1外):\n");
scanf("%d",&ele);
while(ele != -1){
N = (listNode*)malloc(sizeof(listNode));
N->data = ele;
if(i == 0){
L = N;
L->next = NULL;
P = L;
i = 1;
}
else{
P->next = N;
P = N;
}
printf("%d成功进入链表中!\n",ele);
printf("结束创建请输入-1\n");
scanf("%d",&ele);
}
N->next = NULL;
printf("单链表建立完毕!(尾插法)\n");
printlist(L);
}
//增
void add(linkList &L){
int ele,local,i;
listNode* N;
listNode* P;
i = 1;
printf("请输入你想要插入的元素大小以及位置:\n");
scanf("%d %d",&ele,&local);
while((local < 1)||(local > getLength(L))){
printf("输入的位置不合法,请重新输入!\n");
scanf("%d",&local);
}
if(local == 1){
N = (listNode*)malloc(sizeof(listNode));
N->data = ele;
N->next = L;
L = N;
}
else{
P = L;
while(i+1 < local){
i++;
P = P->next;
}
N = (listNode*)malloc(sizeof(listNode));
N->data = ele;
N->next = P->next;
P->next = N;
}
printf("成功插入该元素!\n");
printlist(L);
}
//删
int delelem(linkList &L){
int local,i,ele;
listNode* N;
listNode* P;
i = 1;
printf("请输入你要删除的元素位置:\n");
scanf("%d",&local);
while((local < 1)||(local > getLength(L))){
printf("输入的元素位置不合法,请重新输入!\n");
scanf("%d",&local);
}
if(local == 1){
N = L;
ele = N->data;
L = L->next;
free(N);
}
else{
P = L;
while(i+1 < local){
i++;
P = P->next;
}
N = P->next;
ele = N->data;
P->next = P->next->next;
free(N);
}
printf("删除元素操作成功!\n");
printlist(L);
return ele;
}
//查(按值)
void search(linkList &L){
int ele,i;
listNode* N;
N = L;
i = 1;
printf("请输入你要查找的元素:\n");
scanf("%d",&ele);
while(N != NULL){
if(N->data == ele){
printf("已成功查找该元素,该元素的位置是%d\n",i);
return;
}
i++;
N = N->next;
}
printf("未在此链表中找到该元素!\n");
}
//查(按位)
void searchlocal(linkList &L){
int local,i,ele;
listNode* N;
N = L;
i = 1;
printf("请输入你要查找的元素的位置:\n");
scanf("%d",&local);
while((local<1)||(local>getLength(L))){
printf("输入的位置不合法,请重新输入!\n");
scanf("%d",&ele);
}
while(i < local){
i++;
N = N->next;
}
ele = N->data;
printf("此链表中%d的元素是%d\n",local,ele);
}
//改
void change(linkList &L){
int local,ele,i;
listNode* N;
N = L;
i = 1;
printf("请输入你想要修改的元素大小以及位置:\n");
scanf("%d %d",&ele,&local);
while((local < 1)||(local > getLength(L))){
printf("输入的位置不合法,请重新输入!\n");
scanf("%d",&local);
}
while(i < local){
i++;
N = N->next;
}
N->data = ele;
printf("修改完毕!\n");
printlist(L);
}
int main(){
linkList L;
initialist(L);
judge(L);
//setlinkList(L);
setListrear(L);
add(L);
printf("删除的元素是%d\n",delelem(L));
search(L);
searchlocal(L);
change(L);
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交