#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef int ElemType; // 把int替换成了Elemtype
typedef struct LinkList
{
ElemType elem; // 存储整形元素
struct LinkList *next; // 指向直接后继元素的指针
} LinkList; // 等同于用typedef把struct LinkList定义成Linklist就不需要再输入struct LinkList,可以直接输入LinkList
void InitList(LinkList *L); // 初始化链表声明
void CreateList(LinkList *L, ElemType a[], ElemType n); // 创建链表声明
ElemType ListInsert(LinkList *L, ElemType i, ElemType e); // 链表插入声明
ElemType ListDelete(LinkList *L, ElemType i); // 删除链表声明
void printlist(LinkList *headpoint); // 打印输出表中元素
ElemType main(void)
{
LinkList head; // 头结点
LinkList *headpoint = &head; // 指向头结点的指针(结构体变量并不指向结构体,所以需要声明结构体指针)
ElemType elements[MaxSize], n = 0, insertposition1, insertvalue1, insertposition2, insertvalue2, delete1, delete2; //
InitList(headpoint);
printf("##创建链表##\n\n");
printf("请输入链表中元素值,以空格分隔(如,从键盘上依次输入21 18 30 75 42 56):");
for (int i = 0; i < MaxSize; i++)
{
scanf("%d", &elements[i]);
n++;
if (getchar() == '\n')
{
break;
}
}
/* putchar('\n');
for (int i = 0; i < MaxSize; i++)
{
printf("%d ", elements[i]);
}
putchar('\n');*/
CreateList(headpoint, elements, n);
printlist(headpoint); // 输出各元素的值
putchar('\n');
printf(
"\n##插入操作##\n\n"
"请输入第一次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
scanf("%d %d", &insertposition1, &insertvalue1);
if (ListInsert(headpoint, insertposition1, insertvalue1))
{
printf("在第%d个位置插入%d成功\n", insertposition1, insertvalue1);
}
else
{
printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition1, insertvalue1);
}
printlist(headpoint);
putchar('\n');
printf(
"请输入第二次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
scanf("%d %d", &insertposition2, &insertvalue2);
if (ListInsert(headpoint, insertposition2, insertvalue2))
{
printf("在第%d个位置插入%d成功\n", insertposition2, insertvalue2);
}
else
{
printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition2, insertvalue2);
}
printlist(headpoint);
putchar('\n');
printf(
"\n##删除操作##\n\n"
"请输入第一次要删除元素的位置(如 2 表示删除第2个位置的数值):");
scanf("%d", &delete1);
if (ListDelete(headpoint, delete1))
{
printf("删除第%d个数据元素成功\n", delete1);
}
else
{
printf("删除第%d个数据元素失败,删除位置不合法\n", delete1);
}
printlist(headpoint);
putchar('\n');
printf(
"请输入第二次要删除元素的位置(如 2 表示删除第2个位置的数值):");
scanf("%d", &delete2);
if (ListDelete(headpoint, delete2))
{
printf("删除第%d个数据元素成功\n", delete2);
}
else
{
printf("删除第%d个数据元素失败,删除位置不合法\n", delete2);
}
printlist(headpoint);
putchar('\n');
printf("\n=====顺序表初始化、插入,删除等操作已完成,程序结束!=====\n\n");
system("pause");
return 0;
}
void InitList(LinkList *L) /* 初始化链表 */
{
L = (struct LinkList *)malloc(sizeof(struct LinkList *));
L->next = NULL;
}
void CreateList(LinkList *L, ElemType a[], int n) /*创建链表 */
{
LinkList *pre = L;
int i;
for (i = n - 1; i >= 0; i--)
{
LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
t->elem = a[i];
t->next = NULL;
pre->next = t;
pre = pre->next;
}
}
int ListInsert(LinkList *L, int i, ElemType e) /*按i位置插入元素*/
{
int j = 0;
LinkList *p = L;
while (p && (j < i - 1))
{
p = p->next;
j++;
}
if (!p || (j > i - 1))
return 0;
LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
t->elem = e;
t->next = p->next;
p->next = t;
return 1;
}
int ListDelete(LinkList *L, int i) /*删除某个位置的元素*/
{
int j = 0;
LinkList *p = L;
LinkList *del = NULL;
while ((p->next) && (j < i - 1))
{
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))
return 0;
del = p->next;
p->next = del->next;
free(del);
return 1;
}
void printlist(LinkList *headpoint) // 打印输出表中元素
{
printf("当前表中元素如下\n");
LinkList *p = headpoint;
while (p != NULL)
{
printf("%d ", p->elem);
p = p->next;
}
}