#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
/*******************定义节点结构*****************/
typedef struct Point
{
int data;
struct point * next;
}point,*ppoint;
/********************函数声明*********************/
listinsert(point *head);
outlist(point *head);
ListDelete (point *head);
listupdate (point *head);
/*********************主函数**********************/
main()
{
point *head; int k; //选择器
head=(point*)malloc(sizeof(point));
head->next=NULL;
do
{
printf(" ╔-----------------------------------------------╗\n"); //显示一个简易菜单
printf(" ┆ 1 --- 插入(Insert) ┆\n");
printf(" ┆ 2 --- 修改(Update) ┆\n");
printf(" ┆ 3 --- 删除(Delete) ┆\n");
printf(" ┆ 4 --- 显示( Show ) ┆\n");
printf(" ┆ 5 --- 退出( Exit ) ┆\n");
printf(" ╚-----------------------------------------------╝\n");
printf("请输入所要进行的操作序号: ");
scanf("%d",&k); //接受用户的选择
switch(k) //接受用户的函数
{case 1:listinsert(head);
break;
case 2:listupdate (head);
break;
case 3:ListDelete (head);
break;
case 4:outlist(head);
break;
case 5:break;
default:printf("错误选择!请重选\n");break;
}
}while(k!=5); //直到i被赋值为5
return 0;
}
/*******************************插**入**函**数***************************/
listinsert(point *head)
{
// 在带头结点的单链线性表head的第i个元素之前插入元素e
int i,e;
ppoint p,s;
int j = 0;
printf("请输入要插入节点的位置: ");
scanf("%d",&i);
p = head;
while (p && j < i-1)
{ // 寻找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i-1) {printf("输入有误!!! 请重新输入!\n");return ERROR;} // i小于1或者大于表长
s = (ppoint)malloc(sizeof(point)); // 生成新结点
printf("请输入要插入节点的 值 : ");
scanf("%d",&e);
s->data = e; s->next = p->next; // 插入list中
p->next = s;
return OK;
}
/*******************************删**除**函**数***************************/
ListDelete (point *head)
{
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
point * p,*q;
int i;
int j = 0;
p = head;
printf("请输入要删除节点的位置: ");
scanf("%d",&i);
while (p->next && j < i-1) { // 寻找第i个结点,并令p指向其前趋
p = p->next;
++j;
}
if (!(p->next) || j > i-1) {printf("输入有误!!! 请重新输入!\n");return ERROR;} // 删除位置不合理
q = p->next;
p->next = q->next; // 删除并释放结点
free(q);
return OK;
}
/*******************************修**改**函**数***************************/
listupdate (point *head)
{
// 在带头结点的单链线性表中,修改第i个元素,并由e返回其值
point * p,*q;
int i,ww,j = 0;
p = head;
printf("请输入要修改节点的位置: ");
scanf("%d",&i);
while (p->next && j < i-1) { // 寻找第i个结点,并令p指向其前趋
p = p->next;
++j;
}
if (!(p->next) || j > i-1) {printf("输入有误!!! 请重新输入!\n");return ERROR;} // 修改位置不合理
printf("请输入要修改后节点的值: ");
scanf("%d",&ww);
p = p->next;
p->data=ww;
return OK;
}
/*******************************显**示**函**数***************************/
outlist(point *head) // 带入头指针 打印链表
{
point *p;
p=head->next;
puts("链表如下:");
if(p==NULL){printf("链表为空!\n");exit(0);} //空表显示时执行
printf("head");
do
{
printf(" -> %d",p->data);
p=p->next;
}
while(p!=0);
printf("\n\n");
}