#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define Status int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define ElemType int
typedef struct Node
{
ElemType data;
struct Node *Next;
}Node, *LinkList;
/*头插法创建链表*/
void CreatListHead(LinkList *L, int n)
{
LinkList p = NULL;
int i;
srand((unsigned)time(0)); //产生随机数种子
*L = (LinkList)malloc(sizeof(Node)); //生成头结点
if(NULL == *L)
{
printf("ERROR\n");
exit(-1);
}
else
{
(*L)->Next = NULL; //注意->的优先级高于*,所以必须加括号
}
for(i = 0; i < n; ++i)
{
p = (LinkList)malloc(sizeof(Node));
if (NULL == p)
{
printf("ERROR\n");
exit(-1);
}
p->data = rand()%100; //生成0~100的随机数
p->Next = (*L)->Next; //有头节点
(*L)->Next = p;
}
}
/*尾插法创建链表*/
void CreatListTail(LinkList *L, int n)
{
int i;
LinkList p = NULL, q = NULL;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
if(NULL == *L)
{
printf("ERROR\n");
exit(-1);
}
else
{
(*L)->Next = NULL; //注意->的优先级高于*,所以必须加括号
}
q = *L;
for (i = 0; i < n; ++i)
{
p = (LinkList)malloc(sizeof(Node));
if(NULL == p)
{
printf("ERROR\n");
exit(-1);
}
p->data = rand()%100;
p->Next = q->Next;
q->Next = p;
q = q->Next;
}
}
//删除指定位置的元素
Status ListDelete(LinkList *L, int pos, ElemType *e)
{
LinkList q = NULL;
LinkList p = (*L);
int j = 0;
//判断条件不可以变为p,当删除位置为最后一个元素的下一个元素的后边的元素的时候,最终p为NULL
//NULL->Next错误
while(p->Next && j < pos-1)
{
p = p->Next;
j++;
}
if(!p->Next || j > pos-1)
{
exit(-1);
}
(*e) = p->Next->data;
q = p->Next;
p->Next = q->Next;
free(q);
return OK;
}
/*遍历链表*/
void TraverseList(LinkList *L)
{
LinkList p = (*L)->Next;
while(NULL != p)
{
printf("%d\t", p->data);
p = p->Next;
}
printf("\n");
}
/*销毁单链表*/
void DestroyList(LinkList *L)
{
LinkList p = *L, q = p;
while(NULL != p)
{
q = p->Next;
free(p);
p = q;
}
return;
}
/*清空单链表*/
void ClearList(LinkList *L)
{
LinkList p = (*L)->Next;
LinkList q = NULL;
if (NULL == p)
{
return;
}
else
{
while(NULL != p)
{
q = p->Next;
free(p);
p = q;
}
}
(*L)->Next = NULL;
}
/*头插节点*/
void InsFirst(LinkList *L, LinkList s)
{
s->Next = (*L)->Next;
(*L)->Next = s;
}
/*头删节点*/
void DelFirst(LinkList *L, LinkList *p)
{
if (NULL == (*L)->Next)
{
return;
}
else
{
(*p) = (*L)->Next;
(*L)->Next = (*L)->Next->Next;
}
}
/*末尾追加*/
void AppendList(LinkList *L, LinkList s)
{
LinkList p = (*L);
while(NULL != p->Next)
{
p = p->Next;
}
p->Next = s;
}
/*末尾移除*/
void RemoveTailNode(LinkList *L, LinkList *P)
{
LinkList q = *L;
if(NULL == (*L)->Next)
{
return;
}
else
{
while(NULL != q->Next->Next)
{
q = q->Next;
}
}
*P = q->Next;
q->Next = NULL;
}
/*链表长度*/
int LengthList(LinkList *L)
{
int len = 0;
LinkList p = *L;
while (NULL != p->Next)
{
len++;
p = p->Next;
}
return len;
}
/*判空*/
int Is_Empty(LinkList *L)
{
if(NULL == (*L)->Next)
{
return 1;
}
else
{
return 0;
}
}
/*指定位置插入*/
Status ListInsert(LinkList *L, int pos, ElemType e)
{
LinkList s = NULL;
LinkList p = (*L);
int j = 0; //表示p指向第j个元素
while(p && j < pos-1) //p最终指向第pos-1个位置的元素
{
p = p->Next;
++j;
}
if(!p || j > pos-1)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->Next = p->Next;
p->Next = s;
return OK;
}
/*设置第i个元素的值*/
void SetCurElem(LinkList *L, int pos, int e)
{
int len = 0;
LinkList p = *L;
if (pos < 1 || pos > LengthList(L))
{
return;
}
else
{
while(len != pos)
{
len++;
p = p->Next;
}
p->data = e;
}
}
/*按位置查找元素*/
Status GetCurElem(LinkList *L, int pos, int *e)
{
LinkList p = (*L)->Next;
int j = 1;
while(p && j < pos)
{
p = p->Next;
++j;
}
if(!p || j > pos)
{
return ERROR;
}
(*e) = p->data;
return OK;
}
LinkList GetElemValue(LinkList *L, int e)
{
LinkList p = (*L)->Next;
while(p && p->data != e)
{
p = p->Next;
}
return p;
}
int main(void)
{
int e;
LinkList L; //创建一个头指针
// LinkList p;
CreatListHead(&L, 10);
// CreatListTail(&L, 10);
ListInsert(&L, 2, 9);
TraverseList(&L);
ListDelete(&L, 9, &e);
// GetCurElem(&L, 5, &e);
printf("位置%d\n", e);
// printf("%d\n", GetElemValue(&L, 9)->data);
// AppendList(&L, s); //每插入一个元素,新建一个结点6
// TraverseList(&L);
// RemoveTailNode(&L, &p);
// TraverseList(&L);
// SetCurElem(&L, 5, 1000);
// GetCurElem(&L, 5, &e);
// TraverseList(&L);
// printf("%d", e);
// DelFirst(&L, &p);
// printf("%d\n", p->data);
// InsFirst(&L, s);
// ClearList(&L);
return 0;
}