**
创建双向链表
单项链表节点的存储结构只有一个指向直接后继的指针域,所以从链表的某个节点出发只能顺指针查找其他节点。使用双向链表可以避免单项链表这种单项性的缺点。
顾名思义,双向链表的节点有两个指针域,一个指向其直接后继;另一个指向其直接前驱。``
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include <string>
//声明struct node 类型,代码如下:
typedef struct node {
char name[20];
struct node *prior, *next;
}stud; /*双链表的结构定义*/
//自定义函数creat()
stud *create(int n) {
stud *p, *h, *s;
int i;
h = (stud*)malloc(sizeof(stud)); /*申请节点空间*/
h->name[0] = '\0';
h->prior = NULL;
h->next = NULL;
p = h;
for (i = 0; i < n;i++) {
s = (stud*)malloc(sizeof(stud));
p->next = s; /*指定后继节点*/
printf("输入第%d个学生的姓名:", i + 1);
scanf("%s", s->name);
s->prior = p; /*指定前驱节点*/
s->next = NULL;
p = s;
}
p->next = NULL;
return(h);
}
//自定义函数search(),实现查找要删除的节点
stud *search(stud *h, char *x) {
stud *p; /*指向结构体类型的指针*/
char *y;
p = h->next;
while (p) {
y = p->name;
if (strcmp(y, x) == 0)
return(p);
else
p = p->next;
}
printf("没有找到数据!\n");
}
//自定义函数del(),实现删除链表中的指定节点
void del(stud *p) {
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
}
//在main()函数调用自定义函数create(),实现创建一个链表,并将链表中的数据输出
int main() {
int number;
char sname[20];
stud *head, *sp;
puts("请输入链表的大小:");
scanf("%d", &number);
head = create(number);
sp = head->next;
printf("\n现在这个双链表是:\n");
while (sp) {
printf("%s ", &*(sp->name));
sp = sp->next;
}
printf("\n请输入你想查找的姓名:\n");
scanf("%s", sname);
sp = search(head, sname);
printf("你想查找的姓名是:%s\n", *&sp->name);
del(sp);
sp = head->next;
printf("\n现在这个双链表是:\n");
while (sp) {
printf("%s ", &*(sp->name));
sp = sp->next;
}
printf("\n");
puts("\n 按任意键退出...");
}
本实例实现创建一个双向链表,并将这个链表中的数据输出到窗体上,输入要查找的学生姓名,将查找的姓名从链表中删除,并显示删除后的链表。运行结果下: