标签:
单链表的创建、计数打印、删除与插入操作,提供四轮删除与插入操作,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 }