C语言实现-双链表练习

这篇文章是转载自  http://www.cnblogs.com/Akagi201/archive/2012/03/22/2411054.html要面试没时间了哈哈,我大体看了下几个函数,没能实际验证。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 typedef int ElemType;
  5
  6 //定义双链表结点类型
  7
  8 typedef struct Node{
  9     ElemType data;
10     struct Node *prior; //指向前驱结点
11     struct Node *next;  //指向后继结点
12 }Node, *DLinkList;
13
14 //双链表的建立,采用尾插法建立双链表
15
16 DLinkList DLinkListCreate(){
17     Node *L,*p,*r;
18     L=(Node *)malloc(sizeof(Node));//申请头结点
19     L->next=NULL;
20     r=L;
21     r->next=NULL;   //r 为指向终端结点的指针
22     ElemType x;
23     printf("输入结点啊\n");
24     while(scanf("%d",&x)!=EOF){ //输入双链表元素,建立双链表
25         p=(Node *)malloc(sizeof(Node));
26         p->data=x;
27         p->next=r->next;
28         r->next=p;
29         r=p;
30     }
31     r->next=NULL;
32     return L;
33 }
34
35 //双链表查找,查找元素为x的位置
36
37 int DLinkListFind(DLinkList L,ElemType x){
38     DLinkList p;    //p为检索
39     p=L->next;
40     int i=1;
41     while(p!=NULL && p->data != x){
42         ++i;
43         p=p->next;
44     }
45 //    for(i=1,p=L->next;p;p=p-next,++i){
46 //        if(p->data==x){
47 //            break;
48 //       }
49 //    }
50     if(p==NULL){    //如果没找到返回0
51         return 0;
52     }else{
53         return i;   //如果找到返回i
54     }
55 }
56
57 //双链表插入,在双链表的第i个位置插入值为x的元素(在原来第i个位置前)
58
59 DLinkList DLinkListInsert(DLinkList L,int i,ElemType x){
60     DLinkList p,s;  //s为要插入的结点
61     p=L->next;      //从第一个结点位置开始查找
62     int tempi;
63     for(tempi=1;tempi<i-1;++tempi){
64         p=p->next;
65     }
66     s=(Node *)malloc(sizeof(Node));
67     s->data=x;
68     s->next=p->next;
69     p->next->prior=s;
70     s->prior=p;
71     p->next=s;
72
73     return L;
74 }
75
76 //双链表的删除,删除双链表中第i个结点
77
78 DLinkList DLinkListDelete(DLinkList L,int i){
79     int tempi=1;
80     DLinkList p;    //p为查找结点
81     p=L->next;
82     while((tempi++)!=i && p!=NULL){
83         p=p->next;
84     }
85     if(p==NULL){                //检查是否在双链表中的位置
86         printf("位置不合法\n");
87     }else if(p->next == NULL){
88         p->prior->next=NULL;
89         free(p);
90     }else{
91         p->prior->next=p->next;
92         p->next->prior=p->prior;
93         free(p);
94     }
95 }
96 int main(){
97     DLinkList list,start;
98     list=DLinkListCreate();
99     for(start=list->next;start!=NULL;start=start->next){
100         printf("%d ",start->data);
101     }
102     printf("\n");
103     int i;
104     ElemType x;
105     printf("请输入要查找元素的值:");
106     scanf("%d",&x);
107     i = DLinkListFind(list,x);
108     if(i){
109         printf("在链表中的位置为:%d\n",i);
110     }else{
111         printf("没有这个元素。\n");
112     }
113     printf("请输入插入位置:");
114     scanf("%d",&i);
115     printf("请输入插入元素的值:");
116     scanf("%d",&x);
117     DLinkListInsert(list,i,x);
118     for(start=list->next;start!=NULL;start=start->next){
119         printf("%d ",start->data);
120     }
121     printf("\n");
122     printf("请输入要删除的位置:");
123     scanf("%d",&i);
124     DLinkListDelete(list,i);
125     for(start=list->next;start!=NULL;start=start->next){
126         printf("%d ",start->data);
127     }
128     printf("\n");
129     return 0;
130 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值