单链表中,在C语言可以用结构体指针描述:
- typedef struct Node
- {
- ElemType data;
- struct Node * next;
- }Node;
- typedef struct Node * LinkList
有一点很重要
比如我随便画一个。。
千万别也成
p->next=s;s->netx=p->next;
正确的是
s->netx=p->next;p->next=s;
自己好好想想,不打了。记得是逆序就行了~
好,进入正题,单链表第i个数据插入节点的算法思路:
1.声明一节点p指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;
4.否则查找成功,在系统中生成一个空节点s;
5.将数据元素e赋给s->data;
6.单链表插入标准语句s->next=p->next;p->next=s;
7.返回成功。
实现代码算法如下:
-
- int ListInsert(LinkList *L,int i,ElmeType e)
- {
- int j;
- LinkList p,s;
- p = *L;
- j = 1;
- while(p && j<1)
- {
- p = p->next;
- ++j;
- }
- if(!p || j>=1)
- return ERROR;
- s = (LinkList)malloc(sizeof(Node));
- s->data = e;
- s->next = p->next;
- p->next = s;
- return OK;
- }
如何删除呢?其实只要q=p->next;p->next->q->next;
算法思路省略,直接给出代码:
-
- int ListInsert(LinkList *L,int i,ElmeType e)
- {
- int j;
- LinkList p,s;
- p = *L;
- j = 1;
- while(p && j<1)
- {
- p = p->next;
- ++j;
- }
- if(!(p->next) || j>=1)
- return ERROR;
- q = p->next;
- p->next = q->next;
- *e = q->data;
- free(q);
- return OK;
- }