#include<stdio.h> #include<malloc.h> typedef struct node //定义双链表 { int data; struct node *prior; struct node *next; }snode; snode *creat() //创建双链表尾部插入数据 { snode *head, *p, *q; int x; head = (snode *)malloc(sizeof(snode)); q = head; printf("请输入创建双链表的值,以-1结束. "); printf("x = "); scanf("%d", &x); while (x != -1) { p = (snode *)malloc(sizeof(snode)); p->data = x; q->next = p; p->prior = q; q = p; printf("x = "); scanf("%d", &x); } q->next = NULL; return head; } void display(snode *head) { snode *p = head->next; while (p != NULL) { printf("%4d", p->data); p = p->next; } printf(" "); } int length(snode *head)//测链表的结点数 { snode *p = head->next; int i = 0; while (p != NULL) { p = p->next; i++; } return i; } void opposite(snode *head) { snode *p = head->next; while (p->next != NULL) p = p->next; while (p != head) { printf("%4d", p->data); p = p->prior; } printf(" "); } int insnode(snode *head, int x, int i) //把x插入到链表的第i的位置 { snode *p = head->next, *s; if(i < 1 || i > length(head) + 1) return 0; else if (i == 1) { s = (snode *)malloc(sizeof(snode)); //分配内存 s->next = p; p->prior = s; s->prior = head; head->next = s; s->data = x; } else { s = (snode *)malloc(sizeof(snode)); //分配内存 for (int j = 1; j < i - 1; j++) p = p->next; if (p->next != NULL) { s->next = p->next; p->next->prior = s; p->next = s; s->prior = p; s->data = x; } else { s->next = NULL; p->next = s; s->prior = p; s->data = x; } } return 1; } int delnode(snode *head, int i)//删除链表中第i个结点 { snode *p = head->next, *q = head; if(i < 1 || i > length(head)) return 0; else { for (int j = 1; j < i; j++) { p = p->next; q = q->next; } if (p->next != NULL) { q->next = p->next; p->next->prior = q; } else q->next = p->next; free(p); } return 1; } int main(void) { snode *headl = creat(); //创建双链表 printf("最初的链表如下: "); display(headl); printf("为了证明是双链表反向输出: "); opposite(headl); int num, location; printf("请分别输入您要插入到链表中的数以及想插入的位置:"); scanf("%d %d", &num, &location); if (insnode(headl, num, location)) { printf("插入新值以后的链表如下: "); display(headl); printf("为了证明插入新值以后仍然是双链表,反向输出如下: "); opposite(headl); } else printf("输入有误 "); printf("请输入您想删除的结点位置:"); scanf("%d", &location); if (delnode(headl, location)) { printf("删除第%d个结点后的链表如下: ", location); display(headl); printf("为了证明删除一个结点以后仍然是双链表,反向输出如下: "); opposite(headl); } else printf("输入有误! "); }