#include<stdafx.h>
#include<stdlib.h>
#define length sizeof(struct node)
typedef struct node
{
int data;
struct node *next;
} Test;
Test *head, *p, *q, *r;//定义遍历指针
//带有头结点的链表
Test *Create()//这是一个具有头结点的链表
{
int List_Size;
head = (Test *)malloc(length); //首先创建一个头结点
p = head; //用遍历指针先指向头结点
p->next = (Test *)malloc(length);
p = p->next;
printf("请输入链表的长度:");
scanf("%d", &List_Size);
if (List_Size>0)
{
for (int i = 1; i<List_Size; i++)
{
p->next = (Test *)malloc(length);
p = p->next;
}
p->next = NULL;
return head;
}
else
{
printf("链表的长度必须大于0\n");
}
return head;
}
void InitList(Test *List_Head)//初始化链表
{
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
printf("请输入数据:");
scanf("%d", &p->data);
p = p->next;
}
}
else
{
printf("链表为空,无法初始化\n");
}
}
void Display(Test *List_Head)
{
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
else
{
printf("链表为空,无法展示\n");
}
}
void DestroyList(Test *List_Head)
{
if (List_Head->next != NULL)
{
p = List_Head->next;
q = List_Head->next;
while (p != NULL)
{
p = p->next;
free(q);
q = p;
}
//List_Head=NULL;
//free(List_Head);
printf("销毁成功\n");
}
else
{
printf("链表为空,无需销毁\n");
}
}
void ClearList(Test *List_Head)
{
if (List_Head->next != NULL)
{
q = p = List_Head->next;
while (p != NULL)
{
p = p->next;
free(q);
q = p;
}
List_Head->next = NULL;
printf("清空成功\n");
}
else
{
printf("链表为空,无法清空\n");
}
}
int ListLength(Test *List_Head)
{
int List_Length = 0;
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
List_Length++;
p = p->next;
}
}
else
{
printf("链表为空,长度为0");
}
return List_Length;
}
int ListEmpty(Test *List_Head)
{
if (List_Head->next != NULL)
{
return 0;
}
else
return 1;
}
int *GetElem(Test *List_Head, int i, int *e)//i是第几个元素 用e返回该元素的值
{
if (List_Head->next != NULL)
{
p = List_Head->next;
//if(i<=ListLength(List_Head))
for (int j = 0; j<i; j++)
{
//printf("%d",p->data);
if (j == i - 1)//意味着指针已经挪动到该位置了
{
*e = p->data;//将该元素赋值给e
}
p = p->next;
}
}
return e;
}
void ListInsert(Test *List_Head, int i, int e)//i为要插入的位置 e为要插入的元素 该插入是前插 不是后插
{
if (List_Head->next != NULL)
{
if (i <= ListLength(List_Head))//判断插入的位置存在吗
{
p = List_Head->next;
q = List_Head;
for (int j = 0; j<i; j++)
{
if (j == i - 1)
{
r = (Test *)malloc(length);
r->data = e;
r->next = p;//将r的指针域指向p
q->next = r;//将p的指针域指向r 完成前插
}
p = p->next;//
q = q->next;//p q指针分别向后推一个 p q 一前一后
}
}
else
{
printf("不存在该结点");
}
}
}
int *ListDelete(Test *List_Head, int i, int *e)//i为要删除的位置 用e返回删除的值
{
if (List_Head->next != NULL)
{
p = List_Head->next;
q = head;
for (int j = 0; j<i; j++)
{
if (j == i - 1)
{
*e = p->data;
q->next = p->next;//将p指向的下一个结点赋给指向p自己的指针
free(p);
}
p = p->next;//
q = q->next;//同理 p q 一前一后
}
}
return e;
}
void ListSort(Test *List_Head)//排序 由小到大
{
if (List_Head->next != NULL)
{
q = p = List_Head->next;//指向头结点后的第一个结点
int temp;
while (q->next != NULL)
{
while (p->next != NULL)
{
p = p->next;
if (q->data > p->data)
{
temp = q->data;
q->data = p->data;
p->data = temp;
}
}//循环一次 最小的被交换到前面
q = q->next;//指针向后推一个 继续排后面的
p = q;
}
}
else
{
printf("链表为空,无法排序");
}
}
int main()
{
Test *List_A, *List_B;
List_A = Create();
InitList(List_A);
//DestroyList(List_A);
//ClearList(List_A);
Display(List_A);
/*
ListSort(List_A);
Display(List_A);
*/
/*
ListInsert(List_A,2,100);
Display(List_A);
*/
/*
int num,*p=#
printf("\n%d\n",*(ListDelete(List_A,1,p)));
Display(List_A);
*/
/*
int num;
int *p=#
p=GetElem(List_A,3,p);
printf("%d",*p);
*/
/*
List_B=Create();
InitList(List_B);
Display(List_B);
*/
}