双向链表的应用

来源:互联网 发布:ios wkwebview js弹窗 编辑:程序博客网 时间:2024/05/21 22:43
#include<stdio.h>#include<conio.h>#include<stdlib.h>typedef char DataType;typedef struct Node{DataType data;struct Node *prior;struct Node *next;}DListNode,*DLinkList;DListNode* GetElem(DLinkList head, int i);void PrintDList(DLinkList head);int CreateDList(DLinkList head, int n);int InsertDList(DLinkList henad, int i, char e);int InitDList(DLinkList *head){*head = (DLinkList)malloc(sizeof(DListNode));if (!head)return -1;(*head)->next = *head;  //使头结点的prior和next指针指向自己(*head)->prior = *head;return 1;}int CreateDList(DLinkList head, int n){DListNode *s, *q;int i;DataType e;q = head;for (i = 1; i <= n; i++){printf("输入%d个元素", i);e = getchar();s = (DListNode*)malloc(sizeof(DListNode));s->data = e;//将新生成的结点插入双向循环链表s->next = q->next;q->next = s;s->prior = q;head->prior = s;//这里注意头结点的prior指向新插入的结点q = s;  //q始终指向最后一个结点getchar();}return 1;}int InsertDList(DLinkList head, int i, DataType e){DListNode *p, *s;p = GetElem(head, i);//查找链表中第i个结点if (!p)return 0;s = (DListNode*)malloc(sizeof(DListNode));if (!s)return -1;s->data = e;//将s结点插入到双向链表中s->prior = p->prior;p->prior->next = s;s->next = p;p->prior = s;return 1;}DListNode* GetElem(DLinkList head ,int i){DListNode *p;int j;p = head->next;j = 1;while (p != head && j < i){p=p->next;j++;}if (p == head || j>i)   //如果位置不整确,返回NULLreturn NULL;return p;}void main(){DLinkList h;int n, pos;char e;InitDList(&h);printf("输入元素个数:");scanf("%d", &n);getchar();CreateDList(h, n);printf("链表中的元素:");PrintDList(h);printf("请输入元素以及位置:");scanf("%c", &e);getchar();scanf("%d", &pos);InsertDList(h, pos, e);printf("插入元素后链表中的元素:");PrintDList(h);}void PrintDList(DLinkList head)  //输出循环双链表中的每一个元素{DListNode *p;p = head->next;while (p != head){printf("%c", p->data);p = p->next;}printf("\n");}

0 0
原创粉丝点击