其他分享
首页 > 其他分享> > 双链表的基本操作

双链表的基本操作

作者:互联网

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef int ElemType;
  4 typedef struct DNode{
  5     ElemType data;
  6     struct DNode *prior,*next;
  7 }DNode,*DLinkList;
  8 //双向链表头插法
  9 DLinkList Dlist_head_insert(DLinkList &DL)
 10 {
 11     DNode *s;int x;
 12     //带头结点的链表,不带头结点
 13     DL=(DLinkList)malloc(sizeof(DNode));
 14     DL->next=NULL;
 15     DL->prior=NULL;
 16     //从标准输入读取数据
 17     scanf("%d",&x);
 18     //3 4 5 6 7 9999
 19     while(x!=9999){
 20         //申请一个空间空间,强制类型转换
 21         s=(DLinkList)malloc(sizeof(DNode));
 22         s->data=x;
 23         s->next=DL->next;
 24         //插入第一个结点时,不需要这一步操作
 25         if(DL->next!=NULL){
 26             DL->next->prior=s;
 27         }
 28         s->prior=DL;
 29         DL->next=s;
 30         scanf("%d",&x);//读取标准输入
 31     }
 32     return DL;
 33 }
 34 //双向链表尾插法
 35 DLinkList Dlist_tail_insert(DLinkList &DL)
 36 {
 37     int x;
 38     //带头节点的链表
 39     DL=(DLinkList)malloc(sizeof(DNode));
 40     DNode *s,*r=DL;
 41     DL->prior=NULL;
 42     //3 4 5 6 7 9999
 43     scanf("%d",&x);
 44     while(x!=9999){
 45         s=(DNode*)malloc(sizeof(DNode));
 46         s->data=x;
 47         r->next=s;
 48         s->prior=r;
 49         //r指向新的表尾结点
 50         r=s;
 51         scanf("%d",&x);
 52     }
 53     //尾结点的next指针赋值为NULL
 54     r->next=NULL;
 55     return DL;
 56 }
 57 //按序号查找结点值
 58 DNode *GetElem(DLinkList DL,int i)
 59 {
 60     int j=1;
 61     DNode *p=DL->next;
 62     if(i==0) return DL;
 63     if(i<1)    return NULL;
 64     while(p&&j<i){
 65         p=p->next;
 66         j++;
 67     }
 68     return p;
 69 }
 70 //新结点插入第i个位置
 71 bool DListFrontInsert(DLinkList DL,int i,ElemType e)
 72 {
 73     DLinkList p=GetElem(DL,i-1);
 74     if(NULL==p) return false;
 75     //为新插入的结点申请空间
 76     DLinkList s=(DLinkList)malloc(sizeof(DNode));
 77     s->data=e;
 78     s->next=p->next;
 79     p->next->prior=s;
 80     s->prior=p;
 81     p->next=s;
 82     return true;
 83 }
 84 //删除第i个结点
 85 bool DListDelete(DLinkList DL,int i)
 86 {
 87     DLinkList p=GetElem(DL,i-1);
 88     if(NULL==p) return false;
 89     DLinkList q;
 90     q=p->next;
 91     //删除的元素不存在
 92     if(q==NULL) return false;
 93     //断链
 94     p->next=q->next;
 95     if(q->next!=NULL){
 96         q->next->prior=p;
 97     }
 98     //释放对应结点的空间
 99     free(q);
100     return true;
101 }
102 //链表打印
103 void PrintDList(DLinkList DL)
104 {
105     DL=DL->next;
106     while(DL!=NULL){
107         printf("%3d",DL->data);
108         DL=DL->next;
109     }
110     printf("\n");
111 }
112 
113 //双链表增删查
114 int main()
115 {
116     DLinkList DL;
117     DLinkList search;
118     //Dlist_head_insert(DL);
119     Dlist_tail_insert(DL);
120     //3 4 5 6 7 9999
121     PrintDList(DL);
122     search=GetElem(DL,2);
123     if(search!=NULL){
124         printf("按序号查找成功\n");
125         printf("%3d\n",search->data);
126     }
127     DListFrontInsert(DL,3,99);
128     PrintDList(DL);
129     DListDelete(DL,2);
130     PrintDList(DL);
131     system("pause");
132 }

 

标签:DL,结点,next,DLinkList,双链,基本操作,NULL,DNode
来源: https://www.cnblogs.com/shixinzei/p/12539348.html