//单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
typedef int ElemType;
//单链表结构
typedef struct Node
{
ElemType data;
struct Node *data;
}Node,*LinkList;
//初始化
LinkList LinkListInit()
{
Node *L;
L=(LinkList)malloc(sizeof(Node));
if(L==NULL) return ERROR;
L->next=NULL;
}
//Head法建立单链表
LinkList LinkListCreatHead()
{
Node *L;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
ElemType x;
while(scanf("%d",&x)!=EOF)
{
Node *p;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
}
return L;
}
//Tail法建立单链表
LinkList LinkListCreatTail()
{
Node *L;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
Node *r;
r=L;
ElemType x;
while(scanf("%d",&x)!=NULL)
{
Node *p;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
r->next=L;
r=p;
}
r->next=NULL;
return L;
}
//单链表的插入将x插入到i位置上
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)
{
Node *pre; //pre为前驱结点
pre = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++)
pre = pre->next; //查找第i个位置的前驱结点
Node *p; //插入的结点为p
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = pre->next;
pre->next = p;
return L;
}
////////////////////////////////////////////
//单链表的删除,在链表中删除值为x的元素
LinkedList LinkedListDelete(LinkedList L,ElemType x)
{
Node *p,*pre; //pre为前驱结点,p为查找的结点。
p = L->next;
while(p->data != x) //查找值为x的元素
{
pre = p;
p = p->next;
}
pre->next = p->next; //删除操作,将其前驱next指向其后继。
free(p);
return L;
}
//单链表的清除
void LinkListClear(LinkList L)
{
Node *p,*q;
p=L->next;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
//单链表的输出
LinkList LinkListPrint(LinkList L)
{
Node *p;
for(p=L->next;p!=NULL;p=p->next)
{ printf("%d",p->data);
}
}
//删除单链表中相同的元素
LinkList LinkListDelsame(LinkList L)
{
Node *pre,*p,*pnext;
p=L->next;
pre=L;pnext=p->next;
while(pnext!=NULL) //I worked hard two days!I am very very happy !
{
if(p->data==pnext->data) {pre->next=p->next;free(p);p=pnext;pnext=pnext->next;}
else { pre=pre->next;p=pnext; pnext=pnext->next; }
}
return L;
}
//单链表的逆置
LinkedList LinkedListInverse(LinkedList L)
{
Node *p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
return L;
}