//带头节点的单链表 #include <stdio.h> #include <malloc.h> typedef struct LNode{ //定义单链表 int data; struct LNode *next; }Node , *LinkList; bool InitList(LinkList &); //初始化单链表 bool ListInsert(LinkList & , int , int); //在指定位置插入数据 bool Empty(LinkList); //判断链表是否为空 bool HListInsert(LinkList & , int , int); //在指定节点前面插入数据 bool RListInsert(LinkList * , int , int); //在指定节点后面插入数据 void output(LinkList); //输出链表 bool ListDelete(LinkList & , int , int &); //删除指定位置的数据 bool HeadInsert(LinkList , int); //头插法 Node* GetElem(LinkList , int); //查找指定位置的值 int LocateElem(LinkList , int); //查找指定的值在哪一个位置 int main(void){ LinkList L; InitList(L); HeadInsert(L,5); HeadInsert(L,2); TailInsert(L,7); TailInsert(L,4); RListInsert(&L,2,3); printf("当前单链表中的数据是:"); output(L); printf("\n"); Node* r = GetElem(L,3); printf("你要查找的值是%d",r->data); printf("\n"); int x = LocateElem(L,7); printf("你要查找的值在第%d位",x); printf("\n"); int e = -1; ListDelete(L,2,e); printf("删除的哪一个元素是:%d",e); printf("\n"); printf("当前单链表中的数据是:"); output(L); printf("\n"); if(Empty(L)){ printf("当前链表为空!"); }else{ printf("当前链表不为空! "); } return 0; } //初始化单链表 bool InitList(LinkList &L){ L = (Node*)malloc(sizeof(Node)); if(L == NULL){ return false; } L->next = NULL; return true; } //遍历单链表 void output(LinkList L){ Node *p = L->next; while(p != NULL){ printf("%d ",p->data); p = p->next; } } //判断单链表是否为空 bool Empty(LinkList L){ if(L->next == NULL){ return true; }else{ return false; } } //在指定的位置插入数据 bool ListInsert(LinkList &L ,int i , int e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i-1){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node*)malloc(sizeof(Node)); s->data = e; s->next = p->next; p->next = s; return true; } //在指定节点前面插入数据 bool HListInsert(LinkList &L , int i , int e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node *)malloc(sizeof(Node)); s->data = p->data; p->data = e; s->next = p->next; p->next = s; return true; } //在指定节点后面插入数据 bool RListInsert(LinkList *L , int i , int e){ if(i < 1){ return false; } Node *p = *L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node *)malloc(sizeof(Node)); s->next = p->next; p->next = s; s->data = e; } //删除指定位置的数据 bool ListDelete(LinkList &L , int i , int &e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i-1){ p = p->next; j ++; } if(p == NULL || p->next == NULL){ return false; } Node *q = p->next; e = q->data; p->next = q->next; free(q); return true; } //头插法 bool HeadInsert(LinkList L , int e){ Node *s = (Node *)malloc(sizeof(Node)); //L->next = NULL; //使用头插法创建单链表时须要初始化next s->data = e; s->next = L->next; L->next = s; return true; } //查找指定位置的值 Node* GetElem(LinkList L , int i){ if(i < 1){ return NULL; } Node *p = L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } return p; } //查找指定的值在哪一个位置 int LocateElem(LinkList L , int e){ Node *p = L->next; int j = 1; while(p != NULL && p->data != e){ p = p->next; j ++; } if(p == NULL){ return -1; }else{ return j; } }