#include
#include
#define OK 1
#define ERROR 0
typedef int DataType;
struct Node{
DataType ele;
struct Node* next;
};
typedef struct {
struct Node* pData;
int length;
}LinkedList;
LinkedList* InitList(LinkedList* L)
{
if (NULL==L)
{
L=(LinkedList*)malloc(sizeof(LinkedList));
if(!L)
{
printf("为L申请空间失败!\n");
}
}
L->pData=(struct Node*)malloc(sizeof(struct Node));
if(!L->pData)
{
printf("为L->pData申请空间失败!\n");
return NULL;
}else{
L->pData->next=NULL;
}
L->length=0;
return L;
}
int DestroyList(LinkedList* L)
{
int k=1;
struct Node *p=L->pData->next, *q=L->pData;
for (k=1; k<=L->length; k++)
{
free(q);
q=p;
p=q->next;
}
free(q);
L->pData=NULL;
return 1;
}
int InsertElem(LinkedList* L, DataType x, int i)
{
int k=0;
struct Node *temp, *head;
temp=(struct Node*)malloc(sizeof(struct Node));
temp->ele=x;
temp->next=NULL;
head=L->pData;
if(!L->pData || i-1>L->length)
{
printf("顺序表或是数据位置有问题, 不能插入!");
return ERROR;
}
for(k=1; k
{
head=head->next;
}
temp->next=head->next;
head->next=temp;
temp=NULL;
L->length++;
return OK;
}
int DeleteElem(LinkedList* L, int i)
{
int k=0;
struct Node *head, *temp;
if(!L->pData || 0==L->length || i>L->length)
{
return ERROR;
}
head=L->pData;
for (k=1; k
{ // 注意: 若DataType里面有指针变量的话, 应先释放其占用的空间
head=head->next;
}
temp=head->next;
head->next=head->next->next;
free(temp);
temp=NULL;
L->length--;
return OK;
}
int ReverseList(LinkedList* L)
{
int k=0;
struct Node *p, *q; // 结点指针
if (L->length<=1)
{
return OK;
}
p=L->pData->next->next; // 指向第2个元素
q=p->next; // q指向第3个元素
L->pData->next->next=NULL; // 将第1个元素的下个指针设为NULL,
成为线性表的最后一个元素
for (k=2; k<=L->length-1; k++) // 最后一个元素单独处理
{
p->next=L->pData->next;
L->pData->next=p;
p=q;
q=p->next;
}
p->next=L->pData->next;
L->pData->next=p;
return OK;
}
void PrintNode(struct Node x) // 方便使用
{
printf("%d", x.ele);
printf("\n");
}
void PrintList(LinkedList* L)
{
int k=0;
struct Node* temp=NULL;
if(!L->pData || !L)
{
printf("顺序表不存在!\n");
return;
}
if(0==L->length)
{
printf("顺序表是空的!\n");
return;
}
printf("SSSSSSSSSSSSSSSSSSSSSSSS\n");
temp=L->pData;
for(k=1; k<=L->length; k++)
{
temp=temp->next;
PrintNode(*temp);
}
printf("EEEEEEEEEEEEEEEEEEEEEEEE\n");
}
int SetEmpty(LinkedList* L)
{
int k=1;
struct Node *p=L->pData->next->next,
*q=L->pData->next;
for (k=2; k<=L->length; k++)
{
free(q);
q=p;
p=q->next;
}
free(q);
L->length=0;
L->pData->next=NULL;
return OK;
}
int GetListLength(LinkedList* L)
{
if(L->pData)
{
return L->length;
}
return -1;
}
DataType GetPrior(LinkedList* L, DataType x)
{
struct Node *temp=L->pData->next,
*prior=L->pData;
while(temp)
{
if (temp->ele!=x)
{
prior=temp;
temp=prior->next;
} else {
if (prior!=L->pData){
return prior->ele;
}
}
}
printf("No element!\n");
exit(0);
}
DataType GetNext(LinkedList* L, DataType x)
{
struct Node *temp=L->pData->next;
while(temp)
{
if (temp->ele!=x)
{
temp=temp->next;
} else {
if (temp->next!=NULL){
return temp->next->ele;
}
}
}
printf("No element!\n");
exit(0);
}
DataType GetElem(LinkedList* L, int i)
{
int k=1;
struct Node* temp=L->pData;
if(0>=i || !L->pData || i>L->length)
{
printf("顺序表不存在或是为空表!\n");
}
for (k=1; k<=i; k++){
temp=temp->next;
}
return temp->ele;
}
DataType GetPosition(LinkedList* L, DataType x)
{
int k=0;
struct Node* p;
if(!L->pData)
{
printf("顺序表不存在!\n");
}
p=L->pData;
for(k=1; k<=L->length; k++)
{
p=p->next;
if (p->ele==x ){
return k;
}
}
return -1; // 表示顺序表中无此元素
}
int IsEmpty(LinkedList* L)
{
if(!L->pData)
{
printf("顺序表不存在!\n");
}
return L->length==0;
}
void main()
{
LinkedList* L=NULL;
L=InitList(L); // 初始化顺序表
PrintList(L); // 打印顺序表
InsertElem(L, 10, 1); // 把元素10插入到第1个位置
InsertElem(L, 12, 1); // 把元素10插入到第1个位置
InsertElem(L, 14, 1); // 把元素10插入到第1个位置
PrintList(L); // 打印顺序表
// printf("%d \n", GetPrior(L, 12));
// printf("%d \n", GetNext(L, 12));
printf("%d\n", GetPosition(L, 10)); // 获取元素10所在的位置
// printf("%d\n", GetListLength(L));
printf("%d\n", GetElem(L, 3)); // 获取第i个元素
if(IsEmpty(L)){
printf("顺序表是空的\n");
}else{
printf("顺序表是非空的\n");
}
SetEmpty(L); // 把顺序表置空
PrintList(L); // 打印顺序表
DestroyList(L); // 不要忘了
PrintList(L); // 打印顺序表
if (NULL!=L)
free(L);
}