#include <stdio.h>
#include <stdlib.h>
typedef struct n {
int data;
struct n* next;
struct n* pre;
}* node;
node create();
void print(node head);
node insertNode(node head, int i);
node deleteNode(node head, int i);
int main()
{
node head = create();
int x;
scanf("%d", &x);
head = insertNode(head, x);
print(head);
int y;
scanf("%d", &y);
head = deleteNode(head,y);
print(head);
return 0;
}
node create() {
node cur, dat, head;
struct n pnode; // 创建一个虚拟节点
head = &pnode; // 头指针指向虚拟节点
cur = &pnode; // cur为用于创建链表的指针
int x;
// scanf输入错误返回 EOF
while(scanf("%d", &x) != EOF) {
dat = (node)malloc(sizeof(struct n));
dat->data = x;
dat->pre = cur; // 链表的节点和数据节点链接起来
cur->next = dat;
cur = dat; // 没新加一个节点,cur向后移动一个单位
}
// 将链表的尾结点的next指针指向null
cur->next = NULL;
// head向后移动一个单位,然后将当前的节点的pre指针指向null
head = head->next;
head->pre = NULL;
return head;
}
void print(node head) {
node p = head;
while(p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
node insertNode(node head, int i) {
// 在堆空间分配一片内存,并用 指针指向它
node temp = (node)malloc(sizeof(struct n));
temp->data = i;
node p = head;
// 如果插入点在最前面
if(i <= p->data) {
temp->next = p;
p->pre = temp;
temp->pre = NULL;
return temp;
}
// 定位到插入点
while(p->next && p->data < i) {
p = p->next;
}
// 如果插入点在首节点和尾结点之间
if(p->data >= i) {
temp->next = p;
temp->pre = p->pre;
p->pre->next = temp;
p->pre = temp;
// 如果插入点在尾结点之后
} else {
p->next = temp;
temp->pre = p;
temp->next = NULL;
}
// 返回插入之后的头节点
return head;
}
node deleteNode(node head, int i) {
node p = head;
// 如果首节点为要删除的节点
while(head->data == i) {
node n = head;
head = head->next;
head->pre = NULL;
free(n);
n->next = NULL;
n->pre = NULL;
}
// 删除完毕返回头结点
if(head->data > i)
return head;
// 定位到要删除的节点
while(p->next && p->data<i) {
p = p->next;
}
// 如果要删除的节点不是最后一个
if(p->next && p->data == i) {
node q = p;
while(p->next && p->data == i) {
p = p->next;
}
q->pre->next = p;
p->pre = q->pre;
// 如果要删除的节点是最后一个
} else if(!p->next && p->data==i) {
p->pre->next = NULL;
free(p);
p->pre = NULL;
// 否则输出 "delete error!"
} else {
printf("delete error!\n");
}
return head;
}
C语言双向升序单向链表的创建,插入删除操作,代码经过验证
最新推荐文章于 2022-12-28 11:15:04 发布