// there are some bugs in the prior one , and it's ok when I run it on my Ubuntu os, just believe in me !
// have a good time!
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
/*******************type define**********************/
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}LNode,* LinkList;
/*****************function declaration************************/
LinkList Create_LinkList_H(int n);// insert into head
LinkList Create_LinkList_T(int n);// insert into Tail
int Length_LinkList(LinkList L);
LinkList Init_LinkList(void);
LinkList Locate_LinkList_i(LinkList L, int i);
LinkList Locate_LinkList_x(LinkList L, ElemType x);
void Reverse_LinkList(LinkList L);
void InsertAfter(LinkList p, int x);
void InsertBefore(LinkList L, LinkList p, int x);
void DeleteNode(LinkList L, LinkList p);
void Delete_LinkList_i(LinkList L, int i);
int Delete_LinkList_x(LinkList L, int x);
void print_LinkList(LinkList L);
/*****************************************/
int main()
{
LinkList L;
int n;
printf("please input the length of the list:n=");
scanf("%d",&n);
L=Create_LinkList_T(n);
printf("Create_LinkList_T/n");
print_LinkList(L);
Reverse_LinkList(L);
printf("Reverse_LinkList/n");
print_LinkList(L);
InsertAfter(L,100);
printf("InsertAfter/n");
print_LinkList(L);
Delete_LinkList_i(L,2);
printf("Delete_LinkList_i/n");
print_LinkList(L);
return 0;
}
/*****************************************/
/*
*
*
*/
LinkList Create_LinkList_H(int n)
{
LinkList L,p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; // 先建立一个带头结点的单链表
for (i=n; i>0; --i)
{
p = (LinkList)malloc(sizeof(LNode)); // 生成新结点
printf("index=%d L->data=",i);
scanf("%d", &(p->data));
p->next = L->next;
L->next = p; // 插入到表头
}
return L;
}
LinkList Create_LinkList_T(int n)
{
LinkList L,p,q;
int i;
L=(LinkList)malloc(sizeof(LNode));
p=L;
for(i=1;i<=n;i++)
{
q = (LinkList)malloc(sizeof(LNode));
scanf("%d",&(q->data));
p->next = q;
p = q;
}
p->next = NULL;
return L;
}
LinkList Init_LinkList(void)
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next =NULL;
return L;
}
int Length_LinkList(LinkList L)
{
LinkList p;
int j=0;
p=L->next ;
while(p)
{
j++;
p=p->next;
}
return j;
}
LinkList Locate_LinkList_i(LinkList L, int i)
{
LinkList p=L;
int j=0;
while(j<i && p->next !=NULL)
{
p=p->next;
j++;
}
if(j==i) return p;
else
return NULL;
}
LinkList Locate_linkList_x(LinkList L, ElemType x)
{
LinkList p=L->next ;
while(p!=NULL && p->data!=x)
p=p->next;
return p;
}
void Reverse_LinkList(LinkList L)
{
LinkList p,q,s;
if(!L->next || !L->next->next ) return;
q=L->next->next ;
L->next->next=NULL;
while(q)
{
s=q->next;
q->next=L->next ;
L->next=q;
q=s;
}
}
void InsertAfter(LinkList p, int x)
{
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
}
void InsertBefore(LinkList L, LinkList p, int x)
{
LinkList q,s;
s=(LinkList)malloc(sizeof(LNode));
s->data = x;
q = L;
while(q->next!=p) q=q->next;
s->next = q->next;
q->next = s;
}
int DeleteAfter(LinkList p)
{
LinkList r;
if(p->next!=NULL)
{
r = p->next;
p->next = r->next;
free(r);
return 1;//success
}
return 0;// fail
}
void DeleteNode(LinkList L, LinkList p)
{
LinkList q;
q=L;
while(q->next!=p) q = q->next;
q->next = p->next;
free(p);
}
void Delete_LinkList_i(LinkList L, int i)
{
LinkList q,p;
q = Locate_LinkList_i(L,i-1);
if(q==NULL)
{
printf("position i-1 is not exist!/n");
return;
}
else
{
if(q->next == NULL) printf("position i is not exist!/n");
else
{
p = q->next;
q->next = p->next;
free(p);
}
}
}
/*
*delete all the data that equal to x;
*and return the length of the new LinkList
*/
int Delete_LinkList_x(LinkList L, int x)
{
LinkList q,p;
int count=0;
q=L;
while(q->next)
{
p=q->next;
if(p->data==x)
{
q->next=p->next;
free(p);
count++;
}
else q=p;
}
return count;
}
void print_LinkList(LinkList L)
{
LinkList p=L;
int i=0;
while(p->next)
{
i++; // begin from index==1, and the index==0 is the head without data
p=p->next; // begin from index==1, and the index==0 is the head without data
printf("index=%d L->data=%d/n",i,p->data);
}
}