typedef
struct
LNode{
ElemType data;
//数据域
struct
LNode
*next;
//后继指针域
}LNode,*LinkList
LinkList CreateList(int n) //建立n个节点的单链表
{
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;//初始时头节点后继为空
for(i=0;i<n;i++)
{
NewNode=(LinkList)malloc(sizeof(LNode));
//产生新节点
printf("input the %dth data: ",i+1);
scanf("%d",&(NewNode->data));// 输入节点数据
NewNode->next=head->next;
head->next=NewNode; //将新节点插入在头节点之后
} //for
return head;
}
LinkList CreateList_tail(int n) /*
尾插法建立单链表
*/
{
tail=head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
for(i=0;i<n;i++){
NewNode=(LinkList)malloc(sizeof(LNode));
printf("input data %i:",i+1);
scanf("%d",&NewNode->data);
/*输入元素值*/
tail->next=NewNode;
/*新结点连在表末尾*/
tail=NewNode;
}
tail->next=NULL;
/*结点指针域置空*/
return head;
}
Status GetElem(LinkList L,int i,ElemType *e){
//按序号查找值
j=1;
p=L->next;
while(p&&j<i){
p=p->next;j++;//指针移动i-1次
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}/*GetElem*/
Status ListInsert(LinkList L,int i,ElemType e)
{
//在带头单链表中第i个位置插入元素e
j=1;
p=L;
while(p&&j<i)
//找到第i个节点的直接前驱
{
p=p->next;
j++;
}
if(!p||j>i) return ERROR;
NewNode=(LinkList)malloc(sizeof(LNode));
NewNode->data=e;
NewNode->next =p->next;
p->next=NewNode;
//注意两个语句的先后
return OK;
}
Status ListDelete(LinkList L, int i, ElemType *e)
{
//
删除以L为头指针的单链表的第i个元素
p=L;
j=1 ;
while(p&&j<i)
//找到第I-1个节点
{p=p->next;
j++;
}
if(!p||j>i) return ERROR;
q=p->next;
p->next=q->next;
//改变指针链接
*e=q->data;
free(q);
//释放被删节点
return OK;
} // ListDelete_L