数据结构-线性表-链表
---------------------------------------------------- 一些基本操作
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define True 1
#define False 0
#define MAXSIZE 20
typedef int Status;//函数的返回值类型
typedef int ElemType;//元素类型
//链式存储
typedef struct LNode* LinkList;
typedef struct LNode{
ElemType Data;
LinkList Next;
} LNode;
//LNode L;
//LinkList PtrL;
Status Length(LinkList PtrL)
{/*求表长*/
LinkList p = PtrL;
int j = 0;
while (p)
{
p = p->Next;
j++;
}
return j;
}//O(n)
LinkList FindKth(int k, LinkList PtrL)
{/*按序号查找*/
LinkList p = PtrL;
int i = 1;
while (p && i < k)
{
p = p->Next;
i++;
}
if (i == k)
return p;
else
return NULL;
}
LinkList Find(ElemType X, LinkList PtrL)
{
LinkList p = PtrL;
while (p != NULL && p->Data != X)
p = p->Next;
return p;
}
/*插入一个元素
1.先构造一个新结点
2.在找到链表的第i-1个结点,用p指向
3.修改指针,插入结点*/
Status linkListInsert(ElemType X, int i, LinkList PtrL)
{
LinkList s, p;
int k = 1;
s = (LinkList)malloc(sizeof(struct LNode));//生成一个新的结点
s->Data = X;
p = PtrL;
while (p && k < i - 1)
{/*查找到第i-1个结点*/
p = p->Next;
k++;
}
if (!p||k > i - 1)
{
printf("参数不合法");
return ERROR;
}
else
{
s->Next = p->Next;
p->Next = s;
}
return OK;
}
LinkList linkListInsertway2(ElemType X, int i, LinkList PtrL)
{
LinkList s, p;
if (i == 1)
{
s = (LinkList)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = PtrL;
return s;
}
p = FindKth(i - 1, PtrL);
if (p == NULL)
{
printf("参数不合法");
return NULL;
}
else
{
s = (LinkList)malloc(sizeof(LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
p = FindKth(i - 1, PtrL);
if (p == NULL)
{
printf("输入不合法");
return NULL;
}
else if(p->Next==NULL)
{
printf("输入不合法");
return NULL;
}
else
{
s = p->Next;
p->Next = s->Next;
free(s);
return PtrL;
}
}
/*删除一个结点,并返回删除结点的值*/
Status LinkListDelete(LinkList PtrL, int i, ElemType X)
{
LinkList p, q;
int k=1;
p = PtrL;
while (p && k < i - 1)
{/*找到第i-1个结点*/
p = p->Next;
k++;
}
if (k > i - 1 && !p->Next)
{
printf("输入参数不合法");
return ERROR;
}
else
{
q = p->Next;
p->Next = q->Next;
X = q->Data;
free(q);
}
printf("删除成功");
return X;
}
/*删除一个结点,并返回新的链表的指针*/
LinkList Delete(int i, LinkList PtrL)
{
LinkList s, p;
if (i == 1)
{
s = PtrL;//s指向第一个结点
if (PtrL != NULL) PtrL = PtrL->Next;//从链表中删除
else return NULL;
free(s);
return PtrL;
}
}
/*整张表的创建*/
LinkList CreateList(LinkList Ptrl, int n)
{/*头插法,有头结点*/
LinkList p;
int i;
srand(time(0));//产生随机数种子
Ptrl = (LinkList)malloc(sizeof(LNode));
Ptrl->Next = NULL;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->Data = rand() % 100 + 1;
p->Next = Ptrl->Next;
}
return Ptrl;
}
LinkList CreateListtailway(LinkList Ptrl, int n)
{/*使用尾插法*/
LinkList p,r;
int i;
srand(time(0));//产生随机数种子
Ptrl = (LinkList)malloc(sizeof(LNode));
Ptrl->Data= rand() % 100 + 1;
r = Ptrl;
for (i = 0; i < n-1; i++)
{
p= (LinkList)malloc(sizeof(LNode));
p->Data = rand() % 100 + 1;
r->Next = p;
r = p;
}
r->Next = NULL;
return Ptrl;
}
/*单链表整个的删除*/
Status ClearList(LinkList PtrL)
{/*带有头结点*/
LinkList q, p;
p = PtrL->Next;//指向第一个结点
while (p)
{
q = p->Next;
free(p);
p = q;
}
PtrL->Next = NULL;
return OK;
}