#include<stdio.h> #include<malloc.h>
typedef struct node {
struct node *next;
int data;
}*pointer,node;
typedef struct {
pointer elem; //表基址(用指针*elem表示)
int Length; //表长度(表中有多少个元素)
}List;
List l;
void build() {
pointer p;
p=(node*) malloc(sizeof(node));
l.elem=p;
for(int i=0;i<l.Length;i++)
{
p->next=(pointer)malloc(sizeof(node));
p=p->next;
scanf("%d",&p->data);
}
p->next=0;
}
void insert(int t,int e) {
pointer p,q;
p=l.elem;
if(t<=l.Length)
{
l.Length+=1;
for(int i=1;i<t;i++)
{
p=p->next;
}
q=(pointer)malloc(sizeof(node));
q->data=e;
q->next=p->next;
p->next=q;
}
else {
printf("不存在所插入位置\n");
l.Length-=1;
}
}
void dele(int t,int &e) {
pointer p,q;
p=l.elem;
if(p!=NULL) {
l.Length-=1;
for(int i=1;i<t;i++)
{
p=p->next;
}
q=p->next;
e=q->data;
p->next=q->next;
free(q);
}
}
void print() {
pointer p;
p=l.elem;
if(p!=NULL)
{
printf("该链表有长度为%d\n",l.Length);
printf("依次为");
for(int i=0;i<l.Length;i++)
{
p=p->next;
printf("%d,",p->data);
}
printf("\n");
}
else
printf("此链表为空\n");
}
void add() {
int sum=0;
pointer p;
p=l.elem;
for(int i=0;i<l.Length;i++)
{
p=p->next;
sum+=p->data;
}
printf("该链表的和为%d\n",sum);
}
void main() {
char a;
int t,e;
do
{
printf("【1】建立新链表【2】插入【3】删除【4】输出链表【5】求和【0】退出\n");
scanf("%c",&a);
if(a=='1')
{
printf("请输入您想建立的链表长度");
scanf("%d",&l.Length);
build();
}
if(a=='2')
{
printf("请输入您想插入到第几个元素之前");
fflush(stdin);
scanf("%d",&t);
if(t>l.Length)
printf("不存在所插入位置\n");
else
{
printf("请输入您想插入的元素值");
fflush(stdin);
scanf("%d",&e);
insert(t,e);
}
}
if(a=='3')
{
printf("请输入您想删除第几个元素");
scanf("%d",&t);
e=0;
if(t>l.Length)
printf("不存在所删除位置\n");
else
{
dele(t,e);
printf("删除的元素为%d",e);
}
}
if(a=='4')
{
fflush(stdin);
print();
}
if(a=='5')
{
add();
}
if(a<'0'||a>'5')
{
printf("必须输入0~5之间的数字,请重新输入\n ");
} fflush(stdin);
} while(a!='0');
}