#include
#include
#define ElemType int
typedef struct{
ElemType e;
struct Node *next;
}Node,*pNode,**ppNode;//使用pNode表示一级指针,ppNode表示二级指针
//获得链表中节点数目
int getElemNum(pNode head);
//获得链表最后一个结点的指针
pNode getLastElem(pNode head);
//在链表尾部追加结点,若链表为空,则该节点为首结点
void appendElem(ppNode head,ElemType e);
//获得链表的第i个结点的指针 n>=i>0
pNode getElem(pNode head,int i);
//删除链表尾节点
void delLastElem(ppNode head);
//显示链表的结点数目以及结点数据
void showElem(pNode head);
//删除链表的第i个结点 n>=i>0
void delElem(ppNode head,int i);
//在第i个结点前面添加结点
void insertElem(ppNode head,int i,ElemType e);
int main(int argc, char *argv[])
{
pNode head=NULL;
showElem(head);
appendElem(&head,1);
appendElem(&head,2);
appendElem(&head,3);
appendElem(&head,4);
showElem(head);
delLastElem(&head);
showElem(head);
insertElem(&head,1,10);
showElem(head);
delElem(&head,2);
showElem(head);
pNode p=getElem(head,3);
p->e=9999;
showElem(head);
return 0;
}
int getElemNum(pNode head){
if(!head) return 0;
pNode p=head;
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
pNode getLastElem(pNode head){
if(!head) return NULL;
pNode p=head;
while(p->next) p=p->next;
return p;
}
void appendElem(ppNode head,ElemType e){
pNode node = (pNode)malloc(sizeof(Node));
node->e=e;
node->next=NULL;
if(!*head){
*head=node;
return;
}
pNode p;
p=getLastElem(*head);
p->next=node;
}
void delLastElem(ppNode head){
int n =getElemNum(*head);
if(1>n) return;
if(n==1){
free(*head);
*head=NULL;
return;
}
pNode p = getElem(*head,n-1);
free(p->next);
p->next=NULL;
return;
}
pNode getElem(pNode head,int i){
int n = getElemNum(head);
if(i<1 || i>n) return;
int j=1;
pNode p=head;
while(j
j++;
p=p->next;
}
return p;
}
void showElem(pNode head){
if(!head){
printf("empty link\n");
return;
}
pNode p =head;
int n =getElemNum(head);
printf("this link has %d elems\n",n);
while(p){
printf("%d ",p->e);
p=p->next;
}
printf("\n");
return;
}
void delElem(ppNode head,int i){
int n =getElemNum(*head);
if(i<0 || i>n) return;
if(i==n) {
delLastElem(head);
return;
}
if(i==1){
*head=(*head)->next;
return;
}
pNode p1,p2;
p1=getElem(*head,i-1);
p2=getElem(*head,i+1);
p1->next=p2;
return;
}
void insertElem(ppNode head,int i,ElemType e){
int n=getElemNum(*head);
if(i<1 || i>n) return;
pNode node =(pNode)malloc(sizeof(Node));
node->e=e;
if(1==i){
node->next=getElem(*head,1);
*head=node;
return;
}
pNode p1,p2;
p1=getElem(*head,i-1);
p2=getElem(*head,i);
node->next=p2;
p1->next=node;
return;
}