#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType date;
struct Node* next;
}Node;
typedef struct Node *LinkList;
void CreateLinkListT(LinkList *L,int n)
{
int i=0;
LinkList p;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
while (i<n)
{
p = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个结点的数据:",i+1);
scanf("%d",&p->date);
i++;
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkListW(LinkList* L, int n)
{
LinkList p, r;
int i;
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个结点的数据:", i + 1);
scanf("%d", &p->date);
r->next = p;
r = p;
}
r->next = NULL;
}
void print(LinkList* L,int len)
{
int i;
LinkList p;
p = *L;
printf("此时的单链表数据为:");
for (i = 0; i < len; i++)
{
p = p->next;
printf("%d ",p->date);
}
}
int GetLinkListLength(LinkList* L)
{
int k=0;
LinkList List;
List = (*L)->next;
while (List!=NULL)
{
k++;
List = List->next;
}
return k;
}
Status GetList(LinkList L, int i, ElemType* e)
{
int j;
LinkList p;
j = 1;
p = L->next;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p||j>i)
return ERROR;
else
*e = p->date;
return OK;
}
Status ListInsert(LinkList* L, int i, ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p && j > i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->date=e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList* L, int i, ElemType* e)
{
int j;
LinkList p, q;
p = *L;
j = 1;
while (p->next && j < i)
{
p = p->next;
j++;
}
if (!(p->next) && j > i)
{
return ERROR;
}
else
q = p->next;
p->next = q->next;
*e = q->date;
free(q);
return OK;
}
Status ClearList(LinkList* L)
{
LinkList p, q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return OK;
}
Status IsEmpty(LinkList* L)
{
LinkList p;
p = (*L)->next;
if (p == NULL)
return OK;
else
return ERROR;
}
int main()
{
LinkList* L;
int value;
int LinkListLength;
int len;
int LocationGet, GetValue;
printf("请输入链表长度:");
scanf("%d",&len);
L = (LinkList*)malloc(sizeof(Node));
CreateLinkListW(L, len);
print(L, len);
printf("\n\n____________________________________________\n\n");
printf("请输入需要获取的数据位置:");
scanf("%d", &LocationGet);
if (GetList(*L, LocationGet, &GetValue))
printf("第%d个结点的数据是:%d",LocationGet,GetValue);
printf("\n\n____________________________________________\n\n");
printf("请输入要插入的结点位置:");
scanf("%d", &LocationGet);
printf("请输入要插入的结点数据:");
scanf("%d", &value);
ListInsert(L, LocationGet, value);
LinkListLength = GetLinkListLength(L);
print(L, LinkListLength);
printf("\n\n____________________________________________\n\n");
printf("请输入要删除的结点位置:");
scanf("%d", &LocationGet);
ListDelete(L, LocationGet, &GetValue);
LinkListLength = GetLinkListLength(L);
print(L, LinkListLength);
printf("\n\n____________________________________________\n\n");
printf("执行单链表的全部清空函数!");
ClearList(L);
if (IsEmpty(L))
printf("单链表已清空!");
return OK;
}