#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100//定义线性表空间的初始存储大小为
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;//数据域
struct Node *next;//指针域
}Node,*LinkList;
//typedef struct Node LinkList;//定义LinkList,也可以直接写在上一个Node后面
void Init_List(LinkList *L)//初始化链表
{
*L=(LinkList)malloc(sizeof(Node));//L是二级指针
(*L)->next=NULL;
}
Status Insert_List_Head(LinkList *L)//头插法
{
LinkList p, s;//p s都是指针变量
p =*L;//p等同于头指针,指向头节点
for(int i=1;i<=10;i++)
{
s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
s->data = i;
s->next = p->next;
p->next = s;// s->next=p->next; p->next=s顺序不能反
}
return OK;
}
Status Insert_List_Tail(LinkList *L)//尾插法
{
LinkList p,s;//p s都是指针变量
p=*L;
for(int i=1;i<=10;i++) {
s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
s->data = i;
p->next = s;
p = s;//p永远指向最后一个结点
s->next = NULL;
}
return OK;
}
Status Insert(LinkList *L,int i,ElemType e)//在某个位置插入元素e
{
int j=1;
LinkList p,s;
p=*L;//p等同于头指针,指向头结点
while(p&&j<i)//查找第i-1个结点
{
p=p->next;
j++;
}
if(j>i||!p)
return ERROR;
s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status Delete(LinkList *L,int i)
{
int j=1;
LinkList p,q;
p=*L;//p等同于头指针,指向头结点
while(p&&j<i)//查找第i-1个结点
{
p=p->next;
j++;
}
if(j>i||!p)
return ERROR;
q=p->next;
p->next=q->next;
return OK;
}
void Print_List(LinkList *L)//打印链表
{
LinkList p=(*L)->next;//p指向头结点
while(p) {//要写成p,不能p->next
printf("%d ", p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList L1,L2;//只可以写成LinkList L1,L2,不能写成*L1 *L2,后面传参用L1 L2
Init_List(&L1);
Insert_List_Head(&L1);
printf("头插法的结果:");
Print_List(&L1);
Init_List(&L2);
Insert_List_Tail(&L2);
printf("尾插法的结果:");
Print_List(&L2);
if(Insert(&L1,1,0))
Print_List(&L1);
if(Delete(&L1,11))
Print_List(&L1);
return 0;
}
头插法逆序输出,尾插法正序输出