链表的生成、插入、删除(LinkList)
2008-10-12 15:24
183 查看
[b]数据结构第二次作业:
链表的生成、插入、删除:
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 *L = (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 *L = (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 *e = 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(!p || 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 = #
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
[/b]
相关文章推荐
- 链表(LinkList)的设计与实现(初始化,创建,插入,删除,逆置)
- 线性表之<链表linklist>的储存及插入、删除-C代码实现
- 双向链表的生成,删除,插入
- 双链表删除/插入节点
- 【算法之链表(三)】单链表中,在仅允许使用一个指针的情况下,在指定的节点前面插入以及删除一个节点
- 数据结构—链表的定义、创建、遍历、插入、删除
- 双链表的初始化,建立,插入,查找,删除
- 双向链表的创建、结点的插入、删除与打印
- 单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并
- Partition List(链表的插入和删除操作,找前驱节点)
- 实现双向链表删除一个节点P,在节点P后插入一个节点
- 链表的插入删除和查找_C++实现
- 3.1--3.3.2抽象数据类型ADT、单链表初始化删除插入、Collection接口、Iterator接口的简单介绍
- 链表的逆置、合并、排序以及插入删除
- C语言中,链表的创建,插入,删除,遍历,求链表长度,排序等
- 很简单的数据结构:链表线性存储的创建、取数据、数据添加、数据插入、数据删除
- Java实现单链表的插入、删除、计算链表的长度和输出链表
- 链表的插入和删除
- 链表插入删除
- 指针链表形成,新的结点的插入和删除