标签:
单链表的创建、计数打印、删除与插入操作,提供四轮删除与插入操作,gcc编译通过。
 
1 
#include
<
stdio.h
>
  2 
#include
<
stdlib.h
>
  
/*
使用到其中的malloc和exit函数
*/
  3 
#define
 times 4  /*用于循环次数的控制*/
  4 
  5 
static
 
int
 N
=
4
;  
/*
静态全局变量,用于控制单链表长度
*/
  6 
  7 
typedef 
struct
 _person
  8 
{
  9 
    
char
 name[
12
];
 10 
    
int
 age;
 11 
    
struct
 _person 
*
next;
 12 
}stud;
 13 
 14 
stud 
*
Create(
int
 num)  
/*
创建单链表的函数,num为单链表的长度
*/
 15 
{
 16 
    
int
 i;
 17 
    stud 
*
h,
*
p,
*
q;  
/*
 h为头指针,指向单链表的第一个节点
*/
 18 
    h
=
(stud
*
)malloc(
sizeof
(stud));
 19 
    
if
(h
!=
NULL)
 20 
    {
 21 
        p
=
h;
 22 
        
for
(i
=
0
;i
<
num;i
++
)
 23 
        {
 24 
            q
=
(stud
*
)malloc(
sizeof
(stud));  
/*
 q为指向新建节点的指针
*/
 25 
            
if
(q
!=
NULL)
 26 
            {
 27 
                printf(
"
依次输入第%d个人的姓名和年龄:\n
"
,i
+
1
);
 28 
                scanf(
"
%s%d
"
,q
->
name,
&
q
->
age);
 29 
                q
->
next
=
NULL;  
/*
创建新节点完毕
*/
 30 
                p
->
next
=
q;
 31 
                p
=
q;
 32 
            }
 33 
        }
 34 
    }
 35 
    printf(
"
\n
"
);
 36 
    
return
(h);
 37 
}
 38 
 39 
stud 
*
Delete(stud 
*
person,
int
 post)  
/*
删除单链表指定位置节点的函数
*/
 40 
{
 41 
    
int
 i;
 42 
    stud 
*
cur,
*
pre;
 43 
    cur
=
person;
 44 
 45 
    
if
(
0
==
post)  
/*
如果输入的值为0,则不删除任何节点
*/
 46 
    {
 47 
        printf(
"
\n注意:您决定不删除任何节点!!!\n\n
"
);
 48 
        
return
(person);
 49 
    }
 50 
    
else
 
if
(post
>
N
||
post
<
0
)  
/*
如果输入的值大于单链表长度或者小于0,程序结束
*/
 51 
    {
 52 
        printf(
"
输入有误,程序终止。\n
"
);
 53 
        exit(
1
);
 54 
    }
 55 
    
else
 56 
    {
 57 
        
if
(
1
==
post)  
/*
在单链表头部删除的情况
*/
 58 
        {
 59 
            cur
=
cur
->
next;
 60 
            person
->
next
=
cur
->
next;
 61 
            free(cur);
 62 
        }
 63 
        
else
  
/*
在其它位置删除的情况
*/
 64 
        {
 65 
            
for
(i
=
2
;i
<
post
+
1
;i
++
)  
/*
使pre成为要插入位置的上一位置的节点
*/
 66 
            {
 67 
                cur
=
cur
->
next;
 68 
                pre
=
cur;
 69 
            }
 70 
            cur
=
cur
->
next;
 71 
            pre
->
next
=
cur
->
next;
 72 
            free(cur);
 73 
        }
 74 
        
return
(person);
 75 
    }
 76 
}
 77 
 78 
stud 
*
Insert(stud 
*
person,
int
 post)  
/*
在单链表指定位置插入新的节点的函数
*/
 79 
{
 80 
    
int
 i;
 81 
    stud 
*
cur,
*
pre,
*
node;
 82 
    
 83 
    
if
(post
>
N
+
1
||
post
<
1
)  
/*
如果输入的值大于单链表长度加1或者小于1,程序结束
*/
 84 
    {
 85 
        printf(
"
输入错误,程序终止。\n
"
);
 86 
        exit(
1
);
 87 
    }
 88 
 89 
    
if
(person
!=
NULL)
 90 
    {
 91 
        cur
=
person;
 92 
        node
=
(stud
*
)malloc(
sizeof
(stud));
 93 
        
if
(node
!=
NULL)
 94 
        {
 95 
            printf(
"
请输入新人的姓名和年龄:\n
"
);
 96 
            scanf(
"
%s%d
"
,node
->
name,
&
node
->
age);  
/*
为新的节点输入数据内容
*/
 97 
 98 
            
if
(
1
==
post)
 99 
            {
100 
                node
->
next
=
person
->
next;
101 
                person
->
next
=
node;
102 
            }
103 
            
else
104 
            {
105 
                
for
(i
=
2
;i
<
post
+
2
;i
++
)
106 
                {
107 
                    pre
=
cur;
108 
                    cur
=
cur
->
next;
109 
                }
110 
                node
->
next
=
pre
->
next;
111 
                pre
->
next
=
node;
112 
            }
113 
        }
114 
    }
115 
    printf(
"
\n
"
);
116 
    
return
(person);
117 
}
118 
119 
void
 Print(stud 
*
person)
120 
{
121 
    
int
 post
=
1
;
122 
    stud 
*
cur;
123 
    cur
=
person
->
next;
124 
    printf(
"
当前的节点信息如下所示:\n
"
);
125 
    
while
(cur
!=
NULL)
126 
    {
127 
        printf(
"
第%d个人的姓名是:%s,年龄为:%d\n
"
,post,cur
->
name,cur
->
age);
128 
        cur
=
cur
->
next;
129 
        post
++
;
130 
    }
131 
    N
=--
post;
132 
    printf(
"
当前单链表的长度是:%d\n\n
"
,N);
133 
}
134 
135 
int
 main()
136 
{
137 
    
int
 number,post,i;
138 
    stud 
*
head;
139 
    head
=
Create(N);
140 
    Print(head);
141 
142 
    
for
(i
=
0
;i
<
times;i
++
)
143 
    {
144 
        printf(
"
请输入要删除的节点的位置:\n
"
);
145 
        scanf(
"
%d
"
,
&
number);
146 
        Delete(head,number);
147 
        Print(head);
148 
149 
        printf(
"
请输入要插入节点的位置(此位置是指预期插入成功后新节点在单链表中的位置):\n
"
);
150 
        scanf(
"
%d
"
,
&
post);
151 
        Insert(head,post);
152 
        Print(head);
153 
    
154 
        printf(
"
\n注意:剩余输入轮数为:%d  !!!!!\n\n
"
,(times
-
(i
+
1
)));
155 
    }
156 
157 
    
return
 
0
;
158 
}