Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157000
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: C/C++

2012-08-23 20:12:42

折腾了大半天 终于完成了双向链表的创建,插入和删除,原来的出现“段错误”!是因为我在刚开始创建的时候,就按照单链表的样子,直接依靠next就创建了,然而这个双向链表,得时时刻刻记得“前趋”二字!

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define TRUE 1
  4. #define FALSE 0

  5. //定义双向链表

  6. typedef struct DNode
  7. {
  8.     char data;
  9.     struct DNode *piror;
  10.     struct DNode *next;
  11. }DNode,*Doublelist;

  12. void DInit(Doublelist *L)
  13. {
  14.     *L=(DNode *)malloc(sizeof(DNode));
  15.     (*L)->next=NULL;
  16.     (*L)->piror=NULL;
  17. }
  18. void DCreate(Doublelist L)
  19. {
  20.     int i;
  21.     char c;
  22.     DNode *p;
  23.     p=L;
  24.     //p=(DNode *)malloc(sizeof(DNode));
  25.     printf("please input the string you want:");
  26.     while(1)
  27.     {
  28.         c=getchar();
  29.         if(c=='$')
  30.              break;
  31.         p->data=c;
  32.         p->next=(DNode *)malloc(sizeof(DNode));
  33.         p->next->piror=p;//指明前趋与后继的关系
  34.         p=p->next;
  35.     //    c=getchar();
  36.     }
  37.     printf("创建完成后的链表输出:");
  38. //    p->next=q;
  39. //    q->piror=p;
  40. }
  41. //双向链表的插入操作

  42. int DInsert(Doublelist L,int i,char c)
  43. {
  44.     DNode *s=NULL;
  45.     DNode *p=NULL;
  46.     int j=0;
  47.     p=L->next;
  48.     s=(DNode *)malloc(sizeof(DNode));
  49.     s->piror=NULL;
  50.     s->next=NULL;
  51.     printf("插入后的链表输出:");

  52.     if(s==NULL)
  53.         exit(1);
  54.     while(j<i&&p)
  55.     {
  56.         p=p->next;
  57.         j++;
  58.     }
  59.     if(j==i&&i!=0)
  60.     {    
  61.         s->data=c;
  62.         s->piror=p->piror;
  63.         s->next=p;
  64.         p->piror->next=s;
  65.         p->piror=s;
  66.         return TRUE;
  67.     }
  68.     return FALSE;
  69. }
  70. //双向链表的删除
  71. int DDelet(Doublelist L,int i,char c)
  72. {
  73.     DNode *p;
  74.     int j=0;
  75.     int flag=1;
  76.     p=L->next;
  77.     printf("删除后的链表输出:");
  78.     while(flag)
  79.     {
  80.         if(p&&j<i)
  81.         {
  82.             p=p->next;
  83.             j++;
  84.         }
  85.         else
  86.             flag=0;
  87.     }
  88.     if(p&&j==i)
  89.     {
  90.         p->piror->next=p->next;
  91.         p->next->piror=p->piror;
  92.         free(p);
  93.         return TRUE;
  94.     }
  95.     return FALSE;

  96. }
  97. void DPrint(Doublelist L)
  98. {
  99.     DNode *p;
  100.     p=L;
  101.     while(p)
  102.     {
  103.         printf("%c",p->data);
  104.         p=p->next;
  105.     }
  106.     printf("\n");
  107. }
  108. int main()
  109. {
  110.     Doublelist L;
  111.     char c;
  112.     int i,k;
  113.     DInit(&L);
  114.     DCreate(L);
  115.     DPrint(L);
  116.     printf("请输入想插入字符的位置和相插入的字符值:");
  117.     scanf("%d %c",&i,&c);
  118.     DInsert(L,i,c);
  119.     DPrint(L);
  120.     i=0;
  121.     c=0;
  122.     printf("请输入想要删除字符的位置和相应的字符值:");
  123.     scanf("%d %c",&i,&c);
  124.     DDelet(L,i,c);
  125.     DPrint(L);
  126.     return 0;
  127. }

阅读(2270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~