#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node * pNext;
}NODE, *PNODE;
int data;
struct Node * pNext;
}NODE, *PNODE;
//函数声明
void show();
PNODE create_list();
int length_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
void getValue(PNODE pHead , int pos);
int getPos(PNODE pHead , int val);
bool destory(PNODE pHead);
void show(PNODE pHead);
void getPrior(PNODE pHead , int val);
void getNext(PNODE pHead,int val);
PNODE init_List(PNODE L);
int main() {
int i;
int pos;
int val;
PNODE pHead ;
show();
int inti_Number = 0;
int inti_valNumber = 0;
do{
scanf("%d",&i);
switch (i) {
case 1:
if(inti_Number == 0) {
pHead = init_List(pHead);
}
inti_Number++;
break;
case 2:
if(inti_Number >0) {
destory(pHead);
inti_Number =0;
inti_valNumber = 0;
} else {printf("请初始化!\n");}
break;
case 3:
if(inti_Number >0) {
printf("该链表中元素的个数是:%d\n",length_list(pHead));
} else {printf("请先初始化元素的值!\n");}
break;
case 4:
if(inti_Number >0 && inti_valNumber > 0 ) {
int num ;
printf("请输入一个位置:\n");
scanf("%d",&num);
getValue(pHead,num);
} else {printf("请先初始化元素的值!\n");}
break;
case 5:
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个元素:\n");
scanf("%d",&val);
if(getPos(pHead,val) > 0)
printf("该元素的位置是:%d\n",getPos(pHead , val));
} else {printf("请先初始化元素的值!\n");}
break;
case 6:
int val;
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个值:\n");
scanf("%d",&val);
getPrior(pHead ,val);
}
else {
printf("请先初始化元素的值!\n");
}
break;
case 7:
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个值:\n");
scanf("%d",&val);
getNext(pHead,val);
} else {printf("请先初始化元素的值!\n");}
break;
case 8:
if(inti_Number >0 ) {
printf("请输入您要插入元素的位置以及内容:\n");
scanf("%d %d", &pos, &val);
insert_list(pHead, pos, val);
} else {printf("请先初始化!\n");}
break;
case 9:
if(inti_Number >0 && inti_valNumber > 0) {
int num;
printf("请输入你要想删除的链表位置:\n");
scanf("%d",&num);
if (delete_list(pHead, num))
printf("删除成功\n");
else
printf("删除失败!您删除的元素不存在!\n");
} else {printf("请先初始化元素的值!\n");}
break;
case 10:
if(inti_Number >0 ) {
show(pHead);
} else {printf("请先初始化\n!");}
break;
case 11:
if(inti_Number >0) {
pHead = create_list();
inti_valNumber ++;
} else {printf("请先初始化!\n");}
break;
case 12:
i = 12;
break;
default :
break;
}
printf("请继续选择:");
} while (i!=12);
return 0;
}
void show() {
printf("可执行操作有:\n");
printf("*****************************************************************\n");
printf("***************** 1.初始化或重置链表 *****************\n");
printf("***************** 2.销毁链表 *****************\n");
printf("***************** 3.链表中元素个数 *****************\n");
printf("***************** 4.所指位序的元素值 *****************\n");
printf("***************** 5.链表已存在元素位序 *****************\n");
printf("***************** 6.请输入元素,求直接前驱 *****************\n");
printf("***************** 7.请输入元素,求直接后继 *****************\n");
printf("***************** 8.在第i个位置插入元素 *****************\n");
printf("***************** 9.删除第i个元素 *****************\n");
printf("***************** 10.输出所输入的链表元素 *****************\n");
printf("***************** 11.初始化并输入链表元素 *****************\n");
printf("***************** 12.退出 *****************\n");
printf("*****************************************************************\n");
printf("请输入你的选择:\n");
}
//创建一个链表
PNODE create_list() {
int len;//用来存放有效节点个数
int i;
int val;//用来临时存放用户输入的结点值
printf("请输入您要生成链表结点的个数:");
scanf("%d", &len);
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail = pHead;
pTail->pNext = NULL;
for (i = 0; i < len; i++) {
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("内存分配失败!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
void show();
PNODE create_list();
int length_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
void getValue(PNODE pHead , int pos);
int getPos(PNODE pHead , int val);
bool destory(PNODE pHead);
void show(PNODE pHead);
void getPrior(PNODE pHead , int val);
void getNext(PNODE pHead,int val);
PNODE init_List(PNODE L);
int main() {
int i;
int pos;
int val;
PNODE pHead ;
show();
int inti_Number = 0;
int inti_valNumber = 0;
do{
scanf("%d",&i);
switch (i) {
case 1:
if(inti_Number == 0) {
pHead = init_List(pHead);
}
inti_Number++;
break;
case 2:
if(inti_Number >0) {
destory(pHead);
inti_Number =0;
inti_valNumber = 0;
} else {printf("请初始化!\n");}
break;
case 3:
if(inti_Number >0) {
printf("该链表中元素的个数是:%d\n",length_list(pHead));
} else {printf("请先初始化元素的值!\n");}
break;
case 4:
if(inti_Number >0 && inti_valNumber > 0 ) {
int num ;
printf("请输入一个位置:\n");
scanf("%d",&num);
getValue(pHead,num);
} else {printf("请先初始化元素的值!\n");}
break;
case 5:
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个元素:\n");
scanf("%d",&val);
if(getPos(pHead,val) > 0)
printf("该元素的位置是:%d\n",getPos(pHead , val));
} else {printf("请先初始化元素的值!\n");}
break;
case 6:
int val;
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个值:\n");
scanf("%d",&val);
getPrior(pHead ,val);
}
else {
printf("请先初始化元素的值!\n");
}
break;
case 7:
if(inti_Number >0 && inti_valNumber > 0) {
printf("请输入一个值:\n");
scanf("%d",&val);
getNext(pHead,val);
} else {printf("请先初始化元素的值!\n");}
break;
case 8:
if(inti_Number >0 ) {
printf("请输入您要插入元素的位置以及内容:\n");
scanf("%d %d", &pos, &val);
insert_list(pHead, pos, val);
} else {printf("请先初始化!\n");}
break;
case 9:
if(inti_Number >0 && inti_valNumber > 0) {
int num;
printf("请输入你要想删除的链表位置:\n");
scanf("%d",&num);
if (delete_list(pHead, num))
printf("删除成功\n");
else
printf("删除失败!您删除的元素不存在!\n");
} else {printf("请先初始化元素的值!\n");}
break;
case 10:
if(inti_Number >0 ) {
show(pHead);
} else {printf("请先初始化\n!");}
break;
case 11:
if(inti_Number >0) {
pHead = create_list();
inti_valNumber ++;
} else {printf("请先初始化!\n");}
break;
case 12:
i = 12;
break;
default :
break;
}
printf("请继续选择:");
} while (i!=12);
return 0;
}
void show() {
printf("可执行操作有:\n");
printf("*****************************************************************\n");
printf("***************** 1.初始化或重置链表 *****************\n");
printf("***************** 2.销毁链表 *****************\n");
printf("***************** 3.链表中元素个数 *****************\n");
printf("***************** 4.所指位序的元素值 *****************\n");
printf("***************** 5.链表已存在元素位序 *****************\n");
printf("***************** 6.请输入元素,求直接前驱 *****************\n");
printf("***************** 7.请输入元素,求直接后继 *****************\n");
printf("***************** 8.在第i个位置插入元素 *****************\n");
printf("***************** 9.删除第i个元素 *****************\n");
printf("***************** 10.输出所输入的链表元素 *****************\n");
printf("***************** 11.初始化并输入链表元素 *****************\n");
printf("***************** 12.退出 *****************\n");
printf("*****************************************************************\n");
printf("请输入你的选择:\n");
}
//创建一个链表
PNODE create_list() {
int len;//用来存放有效节点个数
int i;
int val;//用来临时存放用户输入的结点值
printf("请输入您要生成链表结点的个数:");
scanf("%d", &len);
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail = pHead;
pTail->pNext = NULL;
for (i = 0; i < len; i++) {
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("内存分配失败!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
//计算链表长度
int length_list(PNODE pHead) {
PNODE p = pHead;
int len = 0;
while (NULL != p) {
len++;
p = p->pNext;
}
return len-1;
}
return pHead;
}
//计算链表长度
int length_list(PNODE pHead) {
PNODE p = pHead;
int len = 0;
while (NULL != p) {
len++;
p = p->pNext;
}
return len-1;
}
//插入元素
//在pHead所指向链表的第pos个节点的前面插入一个新的节点,新的节点的值是val,并且pos的值是从1开始
//在pHead所指向链表的第pos个节点的前面插入一个新的节点,新的节点的值是val,并且pos的值是从1开始
bool insert_list(PNODE pHead, int pos, int val) {
int i = 0;
PNODE p = pHead;
while (NULL != p && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p){
printf("输入值不合法!\n");
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("动态分配内存失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
int i = 0;
PNODE p = pHead;
while (NULL != p && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p){
printf("输入值不合法!\n");
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("动态分配内存失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
//删除一个链表
bool delete_list(PNODE pHead, int pos) {
int i = 0;
PNODE p = pHead;
while (NULL != p->pNext && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p->pNext)
return false;
PNODE q = p->pNext;
//删除p节点后面的结点
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
//摧毁链表
bool destory(PNODE pHead) {
bool delete_list(PNODE pHead, int pos) {
int i = 0;
PNODE p = pHead;
while (NULL != p->pNext && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p->pNext)
return false;
PNODE q = p->pNext;
//删除p节点后面的结点
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
//摧毁链表
bool destory(PNODE pHead) {
free(pHead);
pHead = NULL;
printf("链表摧毁成功!\n");
return true;
}
pHead = NULL;
printf("链表摧毁成功!\n");
return true;
}
//遍历一个链表
void traverse_list (PNODE pHead) {
PNODE p = pHead ->pNext;
while(NULL != p) {
printf("%d",p->data);
p=p->pNext;//不连续,不能用p++
}
printf("\n");
return;
}
void traverse_list (PNODE pHead) {
PNODE p = pHead ->pNext;
while(NULL != p) {
printf("%d",p->data);
p=p->pNext;//不连续,不能用p++
}
printf("\n");
return;
}
//判断一个链表是否为空
bool is_empty(PNODE pHead) {
if(pHead -> pNext == NULL) {
return true;
} else {return false;}
}
//判断一个链表是否已满
bool is_full(PNODE pHead) {
return true;
}
//初始化链表
PNODE init_List(PNODE pHead) {
pHead = NULL;
printf("已经初始化!\n");
return pHead;
}
//查找指定位置的值
void getValue(PNODE pHead , int pos) {
PNODE p = pHead;
int n = 0;
if(pos < 1 || pos > length_list(p)) {
printf("输入值不合法!\n");
return ;
} else {
while( n < pos) {
p = p->pNext;
n++;
}
printf("该元素是%d\n",p->data);
}
}
//查找元素的位置
int getPos(PNODE pHead , int val) {
PNODE p = pHead;
int pos ;
int len = length_list(p);
for(pos = 0 ; pos <= len ; pos++ ) {
if( val == p->data)
break;
else
p=p->pNext;
}
if(pos <= len){
return pos;
}
else {
printf("该值不存在!\n");
return 0;
}
}
//求前驱
void getPrior(PNODE pHead , int val){
PNODE p;
p = pHead;
int pos = getPos(p , val);
if(pos <= 1 ) {
printf("输入不合法!\n");
return ;
}
while(p->pNext->data != val ) {
p = p -> pNext;
}
printf("该元素的前驱结点是:%d\n",p->data);
return;
}
//求后继
void getNext(PNODE pHead,int val){
PNODE p = pHead;
int n = getPos(p , val);
if(n>= length_list(p)) {
printf("输入值不合法!\n");
return;
}
while(p->data != val) {
p = p->pNext;
}
printf("该元素的求后继结点是:%d\n",p->pNext->data);
}
//输出所输入链表元素
void show(PNODE pHead) {
PNODE p = pHead->pNext;
while(NULL!= p){
printf("%-5d",p->data);
p=p->pNext;
}
printf("\n");
return;
}
//销毁链表
bool is_empty(PNODE pHead) {
if(pHead -> pNext == NULL) {
return true;
} else {return false;}
}
//判断一个链表是否已满
bool is_full(PNODE pHead) {
return true;
}
//初始化链表
PNODE init_List(PNODE pHead) {
pHead = NULL;
printf("已经初始化!\n");
return pHead;
}
//查找指定位置的值
void getValue(PNODE pHead , int pos) {
PNODE p = pHead;
int n = 0;
if(pos < 1 || pos > length_list(p)) {
printf("输入值不合法!\n");
return ;
} else {
while( n < pos) {
p = p->pNext;
n++;
}
printf("该元素是%d\n",p->data);
}
}
//查找元素的位置
int getPos(PNODE pHead , int val) {
PNODE p = pHead;
int pos ;
int len = length_list(p);
for(pos = 0 ; pos <= len ; pos++ ) {
if( val == p->data)
break;
else
p=p->pNext;
}
if(pos <= len){
return pos;
}
else {
printf("该值不存在!\n");
return 0;
}
}
//求前驱
void getPrior(PNODE pHead , int val){
PNODE p;
p = pHead;
int pos = getPos(p , val);
if(pos <= 1 ) {
printf("输入不合法!\n");
return ;
}
while(p->pNext->data != val ) {
p = p -> pNext;
}
printf("该元素的前驱结点是:%d\n",p->data);
return;
}
//求后继
void getNext(PNODE pHead,int val){
PNODE p = pHead;
int n = getPos(p , val);
if(n>= length_list(p)) {
printf("输入值不合法!\n");
return;
}
while(p->data != val) {
p = p->pNext;
}
printf("该元素的求后继结点是:%d\n",p->pNext->data);
}
//输出所输入链表元素
void show(PNODE pHead) {
PNODE p = pHead->pNext;
while(NULL!= p){
printf("%-5d",p->data);
p=p->pNext;
}
printf("\n");
return;
}
//销毁链表