在链表内删除节点又三种不同的情形:
1.删除第一个节点:只需要将head指向第二个节点
2.删除最后一个节点,只需要将指向最后一个节点的指针(引用)指向NULL(null)
3.删除中间节点,只要将需要将指向需要删除节点的指针(引用)指向需要删除节点的下一个节点
C代码:
1
#include<stdio.h>
2
3
struct llist
4

{
5
int num;
6
char name[10];
7
struct llist *next;
8
};
9
typedef struct llist node;
10
typedef node *llink;
11
12
13
/**//*链表的创建*/
14
llink createllist()
15

{
16
llink head;
17
llink ptr,ptr1;
18
int i;
19
20
head = (llink)malloc(sizeof(node)); //分配第一个节点
21
if(!head)
22
return NULL;
23
printf("请输入六项邮寄数据:\n");
24
printf("请输入编号 ==> ");
25
scanf("%d",&head->num);
26
printf("请输入编号(%d)的姓名 ==> ",head->num);
27
scanf("%s",head->name);
28
head->next = NULL;
29
ptr = head;
30
for(i = 1;i < 6; i++)
31
{
32
ptr1 = (llink)malloc(sizeof(node));
33
if(!ptr1)
34
return NULL;
35
printf("请输入编号 ==> ");
36
scanf("%d",&ptr1->num);
37
printf("请输入编号(%d)的姓名 ==> ",ptr1->num);
38
scanf("%s",ptr1->name);
39
ptr1->next = NULL;
40
ptr -> next = ptr1;
41
ptr = ptr ->next;
42
}
43
return head;
44
}
45
46
/**//*链表的节点遍历*/
47
llink findnode(llink head,int num)
48

{
49
llink ptr;
50
51
ptr = head;
52
while(ptr != NULL)
53
{
54
if(ptr->num == num)
55
return ptr;
56
ptr = ptr->next;
57
}
58
return ptr;
59
}
60
61
/**//*链表的输出*/
62
void printllist(llink ptr)
63

{
64
while(ptr != NULL)
65
{
66
printf("Number:[%d]\n",ptr->num);
67
printf("Name:%s",ptr->name);
68
ptr = ptr->next;
69
printf("\n");
70
}
71
}
72
73
/**//*指定节点的删除*/
74
llink deletenode(llink head,llink ptr)
75

{
76
llink previous;
77
78
if(ptr == head) //如果是第一个节点
79
return head->next;
80
else
81
{
82
previous = head;
83
while(previous -> next != ptr) //找到需要查找节点的前一个节点
84
previous = previous->next;
85
86
if(ptr->next == NULL) //链表是否结束
87
//删除最后一个结点
88
previous->next = NULL;
89
else
90
//删除中间一个节点
91
previous->next = ptr->next;
92
}
93
return head;
94
}
95
96
97
void main()
98

{
99
llink head;
100
llink ptr;
101
int num;
102
103
head = createllist();
104
if(!head)
105
{
106
printf("内存分配失败!\n");
107
exit(1);
108
}
109
printf("原来的链表:\n");
110
printllist(head);
111
while(1)
112
{
113
printf("请输入要删除的邮寄编号 ==> ");
114
scanf("%d",&num);
115
if(num != -1)
116
{
117
ptr = findnode(head,num);
118
if(!ptr)
119
printf("没有找到\n");
120
else
121
{
122
head = deletenode(head,ptr);
123
printf("删除后的链表:\n");
124
printllist(head);
125
}
126
}
127
else
128
exit(1);
129
}
130
}

2

3

4



5

6

7

8

9

10

11

12

13


14

15



16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31



32

33

34

35

36

37

38

39

40

41

42

43

44

45

46


47

48



49

50

51

52

53



54

55

56

57

58

59

60

61


62

63



64

65



66

67

68

69

70

71

72

73


74

75



76

77

78

79

80

81



82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98



99

100

101

102

103

104

105



106

107

108

109

110

111

112



113

114

115

116



117

118

119

120

121



122

123

124

125

126

127

128

129

130

C#代码:
1
using System;
2
3
class Node
4

{
5
private int num;
6
7
public int Num
8
{
9
set
{num = value;}
10
get
{return num;}
11
}
12
13
private string name;
14
15
public string Name
16
{
17
set
{name = value;}
18
get
{return name;}
19
}
20
21
private Node next;
22
23
public Node Next
24
{
25
set
{next = value;}
26
get
{return next;}
27
}
28
29
public void Print()
30
{
31
Console.WriteLine("编号:[{0}]",num);
32
Console.WriteLine("姓名:{0}",name);
33
}
34
}
35
36
class Llist
37

{
38
//链表的创建
39
public static Node CreateLlist()
40
{
41
Node head;
42
Node tempNode,tempNode1;
43
int i;
44
45
head = new Node();
46
Console.WriteLine("请输入六项邮寄数据:\n");
47
Console.WriteLine("请输入编号==>");
48
head.Num = Convert.ToInt32(Console.ReadLine());
49
Console.WriteLine("请输入编号({0})的姓名 ==>",head.Num);
50
head.Name = Console.ReadLine();
51
head.Next = null;
52
tempNode = head;
53
for( i = 1 ;i < 6; i++)
54
{
55
tempNode1 = new Node();
56
Console.WriteLine("请输入编号 ==>");
57
tempNode1.Num = Convert.ToInt32(Console.ReadLine());
58
Console.WriteLine("请输入编号({0})的姓名",tempNode1.Num);
59
tempNode1.Name = Console.ReadLine();
60
tempNode1.Next = null;
61
tempNode.Next = tempNode1;
62
tempNode = tempNode.Next;
63
}
64
return head;
65
}
66
67
//链表的节点遍历
68
public static Node FindNode(Node head,int num)
69
{
70
Node tempNode;
71
72
tempNode = head;
73
while(tempNode != null)
74
{
75
if(tempNode.Num == num)
76
return tempNode;
77
tempNode = tempNode.Next;
78
}
79
return tempNode;
80
}
81
82
//链表的输出
83
public static void PrintLlist(Node tempNode)
84
{
85
while( tempNode != null)
86
{
87
tempNode.Print();
88
tempNode = tempNode.Next;
89
}
90
Console.WriteLine();
91
}
92
93
//链表内指定节点的删除
94
public static Node DeleteNode(Node head,Node tempNode)
95
{
96
Node previous;
97
98
if(tempNode == head) //如果是第一个节点
99
return head.Next;
100
else
101
{
102
previous = head;
103
while(previous.Next != tempNode) //找到需要查找节点的前一个节点
104
previous = previous.Next;
105
106
if(tempNode.Next == null) //链表是否结束
107
previous.Next = null; //删除最后一个结点
108
else
109
previous.Next = tempNode.Next; //删除中间一个节点
110
}
111
return head;
112
}
113
114
}
115
116
class Test
117

{
118
public static void Main()
119
{
120
Node head;
121
Node tempNode;
122
int num;
123
124
head = Llist.CreateLlist();
125
Console.WriteLine("原来的链表:");
126
Llist.PrintLlist(head);
127
while(true)
128
{
129
Console.WriteLine("请输入要删除的邮寄编号 ==>");
130
num = Convert.ToInt32(Console.ReadLine());
131
if(num != -1)
132
{
133
tempNode = Llist.FindNode(head,num);
134
if(tempNode == null)
135
Console.WriteLine("没有找到\n");
136
else
137
{
138
head = Llist.DeleteNode(head,tempNode);
139
Console.WriteLine("删除后的链表:");
140
Llist.PrintLlist(head);
141
}
142
}
143
else
144
break;
145
}
146
}
147
}

2

3

4



5

6

7

8



9



10



11

12

13

14

15

16



17



18



19

20

21

22

23

24



25



26



27

28

29

30



31

32

33

34

35

36

37



38

39

40



41

42

43

44

45

46

47

48

49

50

51

52

53

54



55

56

57

58

59

60

61

62

63

64

65

66

67

68

69



70

71

72

73

74



75

76

77

78

79

80

81

82

83

84



85

86



87

88

89

90

91

92

93

94

95



96

97

98

99

100

101



102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117



118

119



120

121

122

123

124

125

126

127

128



129

130

131

132



133

134

135

136

137



138

139

140

141

142

143

144

145

146

147
