链表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 }

 

posted @ 2017-08-03 20:09  angelgame  阅读(86)  评论(0)    收藏  举报