您的位置:首页 > 理论基础 > 数据结构算法

数据结构之单链表的删除

2017-10-28 16:23 197 查看
单链表的删除算法花费的时间注意位于查找,其时间复杂度为O(n)

从上节的插入和删除可以看出,链表上的插入和删除只需要修改指针,无需移动结点

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct singleLink {
int data;
struct singleLink *next;
}linklist;

linklist *creatByEnd2() {
char ch;
linklist *head, *r;
linklist *s;
head = (linklist *)malloc(sizeof(linklist));
r = head;
printf("输入各结点数值");
ch = getchar();
while (ch != '#') {
s = (linklist *)malloc(sizeof(linklist));
s->data = ch;
r->next = s; //设置当前尾结点的后继为s !!注意:r->next==(*r).next,是r所指向的结点
r = s; //尾指针指向s r=s,是指针
ch = getchar();
}
r->next = NULL;
return head; //运行时发现若返回表头指针,则头结点的值被随机分配,所以改为返回头指针的后继
//即从开始结点开始打印
}

linklist *getByPos(linklist *head, int pos) {
linklist *p;
p = head;
int i = 0;
while ((p->next != NULL) && (i < pos)) {
p = p->next;
i++;
}
if (i == pos) return p;
else return NULL;
}

//要求p必须有后继
linklist *deleteList(linklist *head, linklist *p) {
linklist *r;
r = p->next;
p->next = r->next;
free(r);
return head->next;
}

void outPutList(linklist *head) {
linklist *p;
p = head;
while (p != NULL) {
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}

void main() {
linklist *head,*p;
linklist *newHead;
int pos;
head = creatByEnd2();
printf("请输入要查找的序号:");
scanf_s("%d", &pos);
p = getByPos(head, pos);
newHead = deleteList(head,p);
outPutList(newHead);
Sleep(2000);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息