Status ListInsert_L(LinkList *L, int i, ElemType e){ LinkList p = *L; int j = 0; while (p && j < i - 1){//寻找第i-1个结点 p = p->next; ++j; } if (!p || j > i - 1){//i小于1或者i大于表长+1 printf("ERROR!\n"); return(ERROR); } LinkList s = (LinkList)malloc(sizeof(LNode));//生成一个新节点并插入L中 if (s != NULL){ s->data = e; s->next = p->next; p->next = s; return OK; } elsereturn ERROR; }
删除链表L的第i个元素
将被删除的第i个元素赋值给e并由e返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Status ListDelete_L(LinkList *L, int i,ElemType *e){ LinkList p = *L; //L是指向结构体指针的指针,需要取值符* int j = 0; while (p->next && j < i - 1){//寻找第i个结点,并令p指向其前驱 p = p->next; ++j; } if (!(p->next) || j > i - 1){//删除位置不合理 printf("ERROR!\n"); return ERROR; } LinkList q = (LinkList)malloc(sizeof(LNode)); q = p->next; p->next = q->next;//删除原本p->next结点 *e = q->data; //释放结点 free(q); return OK; }
链表遍历函数
1 2 3 4 5 6 7 8 9 10 11 12
Status ListTraverse(LinkList L) { printf("遍历整个链表:"); LinkList p = L->next; if (p) { while(p){ printf("%d ", p->data); p = p->next; } } printf("遍历结束\n"); return OK; }
循环链表遍历函数
想要遍历的元素个数可以超过结点数,即实现循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Status CirListTraverse(LinkList *L,int n) { printf("开始遍历:"); LinkList p = (*L)->next; if (p) { while (n > 0) { if (p->next != *L) { //当没有遍历到尾结点的时候就打印输出元素 printf("%d ", p->data); p = p->next; //访问下一个结点 n--; } else{ //访问到尾结点了,就把指针指向到头结点后面的结点 p = (*L)->next; } } } printf("遍历结束\n"); return OK; }