#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef char ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *LinkList;
/**************初始化单链表****************
* 参数:无 *
* 功能:创建头结点,并返回头指针 *
******************************************/
LinkList InitList(LinkList L)
{
//LinkList L;
L = (LinkList)malloc(sizeof(Node));
L->next = NULL;
return L;
}
/***********判断单链表是否为空************
* 参数: L 单链表的头指针
* 功能: 单链表为空则返回1,否则返回0 *
******************************************/
int IsEmpty(LinkList L)
{
if (L->next == NULL)
return OK;
else
return ERROR;
}
/*************单链表的建立****************
* 参数: L 单链表的头指针 *
* 功能: 采用头插法建立单链表 *
*****************************************/
void CreateFromHead(LinkList L)
{
Node *s;
char c;
int flag = 1;
while (flag)
{
c = getchar();
if (c != '&')
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
}
else
{
flag = 0;
}
}
}
/*************单链表的建立****************
* 参数: L 单链表的头指针 *
* 功能: 采用尾插法建立单链表 *
*****************************************/
void CreatFromTail(LinkList L)
{
Node *r, *s;
int flag = 1;
r = L;
char c;
while (flag)
{
c = getchar();
if (c != '$')
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
}
/*************单链表的插入****************
* 参数: L 单链表的头指针 *
* i 插入位置 *
* e 新结点的数据域的值 *
* 功能: 在i位置前插入新结点 *
*****************************************/
int InsList(LinkList L, int i, ElemType e)
{
Node *pre, *s;
int k;
if (i <= 0)
{
return ERROR;
}
pre = L;
k = 0;
while (pre != NULL && k < i - 1)
{
pre = pre->next;
k = k + 1;
}
if (pre == NULL)
{
printf("插入位置不合理!");
return ERROR;
}
s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = pre->next;
pre->next;
return OK;
}
/*************单链表的删除****************
* 参数: L 单链表的头指针 *
* i 插入位置 *
* e 新结点的数据域的值 *
* 功能: 在i位置前插入新结点 *
*****************************************/
int DelList(LinkList L, int i, ElemType *e)
{
Node *pre, *r;
int k;
pre = L;
k = 0;
while (pre->next != NULL && k < i - 1)
{
pre = pre->next;
k = k + 1;
}
if (pre->next == NULL)
{
printf("删除节点的位置i不合理!");
return ERROR;
}
r = pre->next;
pre->next = r->next;
*e = r->data;
free(r);
return OK;
}
/*************单链表的遍历****************
* 参数: L 单链表的头指针 *
* 功能: 遍历单链表,输出各结点的数据域*
*****************************************/
void PrintList(Node *L)
{
LinkList p = L->next;
if (p == NULL)
{
printf("该链表无节点元素");
}
printf("遍历的结果是:");
while (p!=NULL)
{
printf("p->data");
p = p->next;
}
}
/**************主函数*******************/
int main()
{
LinkList L=0;
ElemType Lb;
int n, i, k;
//调用初始化函数
L=InitList(L);//InitList(&L);
IsEmpty(L);
printf("链表值,以‘&’为结束标志\n");
CreateFromHead(L);
PrintList(L);
printf("输入插入链表的位置和值\n");
scanf_s("%d %d", &i, &k);
if (InsList(L, i, k))
{
printf("插入合理!\n");
PrintList(L);
}
printf("输入删除链表的位置!\n");
scanf_s("%d", &n);
if (DelList(L, n, &Lb))
{
printf("删除成功\n");
printf("删除的数据为%d\n", Lb);
printf("删除的数据后的链表为\n");
PrintList(L);
}
return ERROR;
}