带头结点单链表的基本操作
/*单链表*/ #include<stdio.h> #include<malloc.h> typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; bool InitList(LinkList &L) //初始化单链表 { L=(LNode*)malloc(sizeof(LNode)); if(L==NULL) return false; L->next=NULL; return true; } LinkList head_InsertList(LinkList &L) //头插法建立单链表 { ElemType e; printf("please input some number:"); scanf("%d",&e); while(e!=-1) { LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=e; LNode *p=L; s->next=p->next; p->next=s; scanf("%d",&e); } return L; } LinkList tail_InsertList(LinkList &L) //尾插法建立单链表 { ElemType e; LNode *p=L; printf("please input some number:"); scanf("%d",&e); while(e!=-1) { LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=e; p->next=s; p=s; //p始终指向尾部 scanf("%d",&e); } p->next=NULL; return L; } bool InsertList(LinkList &L,ElemType i,ElemType e) //插入节点操作 { if(i<1) return false; LNode *p=L; int j=0; //当前p指针位置 while(p!=NULL && j<i-1) //找到位置是第i-1的节点 { p=p->next; j++; } if(p==NULL) return false; LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return true; } bool DeleteList(LinkList &L,ElemType i) //删除节点操作 { if(i<1) return false; LNode *p=L,*q=L->next; int j=0; while(q!=NULL && j<i-1) { p=q; q=q->next; j++; } if(q==NULL) return false; p->next=q->next; free(q); } LNode * getElem1(LinkList L,ElemType i) //按位查找节点 { if(i<0) return NULL; int j=0; LNode *p=L; while(j<i && p!=NULL) { p=p->next; j++; } return p; } LNode * getElem2(LinkList L,ElemType e) //按值查找节点 { if(L==NULL) return NULL; LNode *p=L->next; while(p!=NULL && p->data!=e) p=p->next; return p; } void Print(LinkList L) //输出单链表 { LNode *p=L->next; while(p!=NULL) { printf("%d\n",p->data); p=p->next; } } void main() { LinkList L; InitList(L); head_InsertList(L); Print(L); printf("************\n"); DeleteList(L,2); Print(L); printf("************\n"); InsertList(L,2,100); Print(L); printf("************\n"); printf("%d\n",getElem1(L,3)->data); printf("************\n"); printf("%d\n",getElem2(L,100)->data); printf("************\n"); }