链表test
今天学了下链表,自己敲了一遍,有点小瑕疵,有点不明白为什么我的下标为0处不可以插入节点呢,是因为不能代替头结点吗,希望各位大牛们把我看一看
纯小白一只\(^o^)/,万分感谢
1 //程序内部存放一个头指针,一个地址,内存内部存放多段地址,第二个与头地址相连 2 #include <iostream> 3 #include <cstdio> 4 #include <time.h> 5 6 using namespace std; 7 8 #define ERROR 0 9 #define OK 1 10 11 typedef struct node{ 12 int data; 13 struct node *next; 14 }linkedlist,*plist; //plist定义的就是指针型,所以后面的不用定义为*p之类的 15 16 plist creat_node(int n) {//返回构造的地址,所以是plist类型 17 plist p = (plist)malloc(sizeof(linkedlist)); 18 p->data = n; 19 p->next = NULL; 20 return p; 21 } 22 23 plist clear_node( plist head ) { 24 plist p = head; 25 plist q; 26 while ( p ) { 27 q = p; 28 free(p); 29 p = q->next; 30 } 31 } 32 // 在head前面增加虚拟节点就可以少了一步特判index = 0的时候 33 plist insert_node (plist head, plist new_node, int index) { 34 linkedlist ret;//建立虚拟节点,防止index = 0时没有办法向前走 35 ret.next = head; 36 plist p = &ret; 37 while (index > 0 && p != NULL) { 38 p = p->next; 39 index--; 40 } 41 if (p == NULL) { 42 return ret.next; 43 } 44 new_node->next = p->next; 45 p->next = new_node; 46 return ret.next; 47 } 48 // 因为需要前一个节点的信息,所以设置一个虚拟节点 49 plist delete_node (plist head, int x) { 50 linkedlist ret; 51 ret.next = head; 52 plist p = &ret; 53 plist q = head; 54 while ( q && q->data != x) {//p一直在q前一位 55 p = p->next; 56 q = q->next; 57 } 58 if ( q ) {//找到了,释放q 59 p->next = q->next; 60 free(q); 61 ret.data = OK; 62 } 63 return ret.next; 64 } 65 66 void output(plist head) { 67 plist p = head; 68 if( p == head ) { 69 cout << head->data; 70 p = p->next; 71 } 72 while ( p ) { 73 cout << "->" <<p->data; 74 p = p->next; 75 } 76 cout << endl; 77 } 78 79 int length_node(plist head) { 80 plist p = head; 81 int length; 82 while ( p ) { 83 p = p->next; 84 length++; 85 } 86 return length; 87 } 88 89 int main( ) { 90 int opr,n; 91 srand(time(0)); 92 plist p; 93 plist head = creat_node(rand() % 100 + 1); 94 while (cin >> opr){ 95 switch (opr){ 96 case 0 :{ 97 while (cin >> n ) { 98 if (n > 100) 99 break; 100 insert_node(head,creat_node(rand() % 100 + 1), n); 101 cout << length_node(head) << endl; 102 output(head); 103 } 104 105 break; 106 } 107 case 1 :{ 108 while (cin >> n) { 109 delete_node(head, n); 110 length_node(head); 111 output(head); 112 } 113 114 break; 115 } 116 default :{ 117 cout<<"ERROR"; 118 break; 119 } 120 } 121 } 122 clear_node(head); 123 return 0; 124 }

浙公网安备 33010602011771号