#include <stdlib.h>
#include<stdio.h>
typedef int ElemType;
typedef struct List *link;
typedef struct List LNode;
struct List{
ElemType data;
struct List *next;
};
/** 链表的建立
* @param Head 头指针
*/
link create(link Head){
ElemType newData;
link NewPoint;
Head=(link)malloc(sizeof(LNode));
printf("please input number:\n");
scanf("%d",&newData);
Head->data=newData;
Head->next=NULL;
while(1){
NewPoint=(link)malloc(sizeof(LNode));
if(NewPoint==NULL)
break ;
printf("please input number: input '-1' means exit \n");
scanf("%d",&newData);
if(newData==-1)
return Head;
NewPoint->data=newData;
NewPoint->next=Head;
Head=NewPoint;
}
return Head;
}
/** 链表的展示
* @param Head 头指针
*/
void display(link Head){
link p;p=Head;
if(p==NULL)
printf("\nList is empty\n");
else
do{
printf("%d\t",p->data);
p=p->next;
}while (p!=NULL);
}
/** 结点的插入
* @param Head 头指针
* @param x 插入结点数据域值
* @param i 插入的位置
*/
link insert(link Head , ElemType x ,int i){
link NewPoint,p=Head;
int j=1;
NewPoint=(link)malloc(sizeof(LNode));
NewPoint->data=x;
if(i==1)
{
NewPoint->next=Head;
Head=NewPoint;
}else
{
while(j<i-1&&p->next!=NULL)
{
p=p->next;
j++;
}
if(j==i-1)
{
NewPoint->next=p->next;
p->next=NewPoint;
}
else
printf("insert is faliure , i is not right");
}
return Head;
}
/** 链表的删除
* @param Head 头指针
* @param i 待删除结点的位置
*/
link del(link Head, int i){
int j=1;link p,t; p=Head;
if(i==1)
{
p=p->next;
free(Head);
Head=p;
}
else
{
while(j<i-1&&p->next!=NULL)
{
p=p->next;
j++;
}
if(p->next!=NULL&&j==i-1)
{
t=p->next;
p->next=t->next;
}
if(t!=NULL)
free(t);
}
return Head;
}
/** 获取结点元素的值
* @Head 头结点
* @param i 结点位置
*/
ElemType get(link Head,int i){
int j=i;
link p; p=Head;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
if(p!=NULL)
return (p->data);
else
printf("data is error");
return-1;
}
/** 查找结点元素X的位置
* @param Head 头指针
* @param x 元素
*/
int locate(link Head, ElemType x){
int n=0;link p;p=Head;
while(p!=NULL&&p->data!=x)
{
p=p->next;
n++;
}
if(p==NULL)
return -1;
else
return n+1;
}
/** 返回链表的长度
* @param Head
* @return
*/
int length(link Head)
{
int len=0;link p;p=Head;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
/** 连接两个链表
* @param Head1 链表1头指针
* @param Head2 链表2头指针
* @return
*/
link concat(link Head1, link Head2){
link p; p=Head1;
while(p->next!=NULL)
{
p=p->next;
}
p->next=Head2;
return Head1;
}
/** 比较两个链表是否相同
* @brief compare
* @param Head1 链表1头指针
* @param Head2 链表2头指针
* @return
*/
int compare(link Head1, link Head2){
link p1,p2;p1=Head1;p2=Head2;
while(1)
{
if((p1->next==NULL)&&(p2->next==NULL))
return 1;
if(p1->data!=p2->data)
return 0;
else
{
p1=p1->next;
p2=p2->next;
}
}
}
/** 释放链表
* @brief setnull
* @param Head 链表头指针
* @return
*/
link setnull(link Head){
link p;p=Head;
while(p!=NULL)
{
p=p->next;
free(Head);
Head=p;
}
return Head;
}