初学者,有错误请指正,谢谢!
C语言头指针单链表实现:
#include
#include
#include
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//创建一个空表
LinkList CreateList(LinkList L){
LinkList p=NULL;
if(L==NULL){
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL){
free(p);
exit(0);
}
L=p;
L->next=NULL;
}
else
exit(0);
return L;
}
//创建一个长度为size的链表(链尾插入)
LinkList CreateList_T(LinkList L,int size){
LinkList p,q;
int i;
L=CreateList(L);
p=L;
for(i=0;i
q=(LinkList)malloc(sizeof(LNode));
if(!q){
free(q);
exit(0);
}
else{
//printf("data:");
//scanf("%d",&q->data);
q->data=rand()%100;
q->next=NULL;
p->next=q;
p=q;
if(i==0)
L->next=p;
//printf("%d\n",p->data);
}
}
return L;
}
//创建一个长度为size的链表(链头插入)
LinkList CreateList_H(LinkList L,int size){
LinkList p;
int i;
L=CreateList(L);
for(i=size;i>0;i--){
p=(LinkList)malloc(sizeof(LNode));
if(!p)
exit(0);
else{
//printf("data:");
//scanf("%d",&p->data);
p->data=rand()%100;
p->next=L->next;
L->next=p;
}
}
return L;
}
//链表长度
int ListLength(LinkList L){
LinkList p=L->next;
int i=0;
while(p){
p=p->next;
i++;
}
return i;
}
//插入元素
void InsertNode(LinkList L,int pos,ElemType e){//元素插在第pos个位置
LNode *p=L,*q;
int i=0;
while(p->next!=NULL&&i
p=p->next;
i++;
}
if(!p||i>pos-1)//pos小于1或大于表长+1
exit(0);
q=(LinkList)malloc(sizeof(LNode));
if(!q)
exit(0);
else{
q->data=e;
q->next=p->next;
p->next=q;
}
}
//删除元素
ElemType DeleteNode(LinkList L,int pos){
LNode *p=L,*q;
ElemType e;
int i=0;
while((p->next!=NULL)&&(i
p=p->next;
i++;
}
if(!(p->next)||i>pos-1)
exit(0);
else{
q=p->next;
p->next=q->next;
e=q->data;
free(q);
}
return e;
}
//检查头指针及其next域是否为空
void CheckLinkList(LinkList L){
if(!L)
exit(0);
if(!(L->next))
exit(0);
}
//遍历链表
void TraverseList(LinkList L){
LinkList p;
CheckLinkList(L);
for(p=L->next;p!=NULL;p=p->next){
printf("Element is %d\n",p->data);
}
}
//查询元素在链表第一次出现的位置
int SearchNode(LinkList L,ElemType e){
int i=0;
LNode *p=L->next;
while(p){
i++;
if(p->data==e)
return i;
p=p->next;
}
return 0;
}
//倒置链表
LinkList ReverseList(LinkList L){
LNode *p,*q,*s;
p=L;
q=p->next;
while(q->next){
s=q->next;
q->next=p;
p=q;
q=s;
}
q->next=p;
L->next->next=NULL;
L->next=q;
return L;
}
//删除链表
void DeleteList(LinkList L){
LNode *p,*q;
CheckLinkList(L);
p=L->next;
while(p){
q=p;
p=p->next;
free(q);
}
free(p);
}
int main(){
int n,length,pos;
LinkList L=NULL;
scanf("%d",&n);//链表长度
//L=CreateList_T(L,n);
L=CreateList_H(L,n);
TraverseList(L);
length=ListLength(L);
printf("The length of the linklist is %d\n\n",length);
InsertNode(L,1,0);
TraverseList(L);
pos=SearchNode(L,41);
printf("The position of 41 is %d\n",pos);
length=ListLength(L);
printf("The length of the linklist is %d\n\n",length);
DeleteNode(L,1);
TraverseList(L);
length=ListLength(L);
printf("The length of the linklist is %d\n\n",length);
L=ReverseList(L);
TraverseList(L);
DeleteList(L);
return 0;
}