数据结构之单链表的删除
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);
}
从上节的插入和删除可以看出,链表上的插入和删除只需要修改指针,无需移动结点
#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);
}
相关文章推荐
- 数据结构 单链表删除结点 例子
- 程序员面试宝典之数据结构基础----②单链表删除节点(读后)
- 数据结构-单链表节点的删除
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 实战数据结构(2)_两个单链表间的删除操作
- 数据结构(三)——单链表的插入与删除
- 【数据结构】单链表的倒序、删除相同结点、按值排序等简单操作用java实现
- 数据结构:程序加图示分析单链表的插入和删除操作
- 结构之美:删除单链表指定位置的数据
- 【数据结构】单链表(二)单链表的逆置,合并与删除
- 数据结构-单链表的读取,插入与删除
- 【数据结构】单链表的建立,测长,打印,删除,插入, 排序, 逆置
- 成人版java数据结构之单链表II删除
- 【数据结构】单链表(一)单链表的定义,插入,删除和查找操作
- 删去单链表中第i个节点的操作。删除单链表中数据域为x的前驱元素。数据结构。
- 数据结构之 线性表---单链表的应用(重复元素删除)
- 数据结构:头插法、尾插法创建单链表,求链表长度、查找、插入、删除、合并
- 数据结构——链表之单链表重复元素的删除
- 数据结构之单链表删除第i个元素并用e返回其值的算法
- 【数据结构】单链表—在O(1)时间删除链表结点