链表的生成、插入、删除(LinkList)

 

数据结构第二次作业:

 

链表的生成、插入、删除:

 

 

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #include<stdlib.h>
  4 
  5 #define OVERFLOW -2
  6 #define OK 1
  7 #define ERROR 0
  8 #define NULL 0
  9 
 10 typedef int Status;
 11 typedef int ElemType;
 12 
 13 typedef struct LNode{
 14     ElemType  data;
 15     struct LNode *next;
 16 }LNode,*LinkList;
 17 
 18 void CreateList_L_Head(LinkList *L,int n); //插入到表头
 19 void CreateList_L_Tail(LinkList *L,int n); //插入到表尾
 20 void PrintList_L(LinkList L);            //输出链表数据
 21 Status ListInsert_L(LinkList L,int i,ElemType e); //插入元素
 22 Status ListDelete_L(LinkList L,int i,ElemType *e); //删除元素
 23 
 24 int main()
 25 {
 26     LinkList La = NULL,Lb = NULL;
 27     int index = 0;
 28     int num = 0;
 29 
 30     printf("Please input 5 numbers(Head Mode):\n");
 31     CreateList_L_Head(&La,5);
 32     PrintList_L(La);
 33     free(La); //  This is a joke?.will cause an error?!
 34 
 35     printf("Please input 5 numbers(Tail Mode):\n");
 36     CreateList_L_Tail(&Lb,5);
 37     PrintList_L(Lb);
 38 
 39     printf("Please input the index&number to Insert:");
 40     scanf("%d",&index);
 41     scanf("%d",&num);
 42     ListInsert_L(Lb,index,num);
 43     printf("\nInsert OK\n");
 44     PrintList_L(Lb);
 45 
 46     printf("Please input the index to delete:");
 47     scanf("%d",&index);
 48     ListDelete_L(Lb,index,&num);
 49     printf("\nDelete OK\n");
 50     PrintList_L(Lb);
 51 
 52     return 0;
 53 }
 54 
 55 void CreateList_L_Head(LinkList *L,int n)
 56 {
 57     LinkList p;
 58     int i = 0;
 59     *= (LinkList)malloc(sizeof(LNode));
 60     (*L)->next = NULL;
 61     for(i=n;i>0;i--)
 62     {
 63         p = (LinkList)malloc(sizeof(LNode));
 64         scanf("%d",&p->data);
 65         p->next = (*L)->next;
 66         (*L)->next = p;
 67     }
 68 }
 69 
 70 void CreateList_L_Tail(LinkList *L,int n)
 71 {
 72     LinkList p,q;
 73     int i = 0;
 74     *= (LinkList)malloc(sizeof(LNode));
 75     q = *L;
 76     (*L)->next = NULL;
 77     for(i=n;i>0;i--)
 78     {
 79         p = (LinkList)malloc(sizeof(LNode));
 80         scanf_s("%d",&p->data);
 81         q->next = p;
 82         q = p;
 83         p->next = NULL;
 84     }
 85     
 86 }
 87 
 88 
 89 void PrintList_L(LinkList L)
 90 {
 91     LinkList p = L->next;
 92     printf("LinkList: ");
 93     while(p)
 94     {
 95         printf("%d",p->data);
 96         if(p=p->next)
 97             printf("-->");
 98     }
 99     printf("\n");
100 }
101 
102 Status ListDelete_L(LinkList L,int i,ElemType *e)
103 {
104     LinkList p = L;
105     LinkList q;
106     int j = 0;
107 
108     while(p->next && j<i-1)
109     {
110         p = p->next;
111         ++j;
112     }
113     if(!(p->next) || j>i-1)
114         return ERROR;
115     q = p->next;
116     p->next = q->next;
117     *= q->data;
118     free(q);
119 
120     return OK;
121 }
122 
123 Status ListInsert_L(LinkList L,int i,ElemType e)
124 {
125     LinkList p = L,s;
126     int j = 0;
127     while(p && j<i-1)
128     {
129         p = p->next;
130         ++j;
131     }
132     if(!|| j>i-1)
133         return ERROR;
134     s = (LinkList)malloc(sizeof(LNode));
135     s->data = e;
136     s->next = p->next;
137     p->next = s;
138 
139     return OK;
140 }
141         
142 
143 
144 
145 

 

 

这个程序是相当的简单!只要领悟了班主任LY的“抄书”两个字的精髓…10分钟搞定不成问题..

说下唯一的难点:二级指针;

我很想知道有谁在写这段代码时完全没意识到这个二级指针的障碍…如果你顺利得出正确结果,而且没有考虑关于L的指针的指针问题,那么,恭喜你:起码你已经领悟了C/C++混合编程的特点、知道引用和指针的语法糖关系、晓得传址实际上也是传值…

 

我也不知道如何说明二级指针的问题,反正代码写多了就明白了..林锐的书里面会经常涉及这种小技巧一类的,可以参考<highQulityC/C++>

 

 

下面贴段代码:

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int temp = 517;
 5 
 6 void Fun(int num,int* pnum,int** ppnum)
 7 {
 8     num = 2;    // num = 1
 9     *pnum =  3// num = 3
10     pnum = &temp;  // num = 3
11     *ppnum = &temp; // *pnum = 517
12 }
13     
14 
15 
16 int main()
17 {
18     int num = 1;
19     int *pnum = &num;
20     cout<<num<<endl<<&num<<endl<<pnum<<endl<<&pnum<<endl;
21     Fun(num,pnum,&pnum);
22     cout<<endl<<endl;
23     cout<<num<<endl<<&num<<endl<<pnum<<endl<<&pnum<<endl;
24     cout<<*pnum<<endl;
25 }

 

 

 

 

自己悟出来的才是牛人..啊哈哈…

 

我突然发现第一次作业写的太SB了,这种封装简直就是糟蹋C++、糟蹋内存啊…

我写代码的水平太一般了..估计软件那边一半以上的人都比我好…

所以我干脆改行去检测代码好了..czy同学很经典的一句话:哎,这个世界上SB程序员就是多啊!(摘自其baidu空间)

最近很崇拜C++的小规模编程和大规模编程的风格研究:代表人物及其作品:林锐的<HighQulityC/C++>(小规模编程)、Tom Cargill的<C++ Programming Style>(大规模编程)

特别提示:<C++ Programming Style>一书已经由某姓聂牛人翻译(聂雪军)

为啥子专门提出他姓聂呢..自己想去吧….

 

 

最近很忙..随便写了下子作业而已…其实也是抄书上代码,所以贴出来了…没什么特殊目的…

过几天准备写下我读<C++ 一致性>的感悟写哈,读优秀的代码简直就是跟圣人对话….

 

 

                               ------by NewSketcehr

                                 Time: 08.10.10 15:12

 

 

 

 

 

posted @ 2008-10-12 15:24  端木  阅读(7231)  评论(4编辑  收藏  举报