初学数据结构五

  1 void MergeList(LinkList &ha, LinkList &hb, LinkList &hc)
  2 {
  3     LinkList pa, pb;
  4     pa = ha;
  5     pb = hb;
  6     while (pa->next && pb->next)
  7     {
  8         pa = pa->next;
  9         pb = pb->next;
 10     }
 11     if (!pa->next)
 12     {
 13         hc = hb;
 14         while (pb->next)
 15             pb = pb->next;
 16         pb->next = ha->next;
 17     }
 18     else
 19     {
 20         hc = ha;
 21         while (pa->next)
 22             pa = pa->next;
 23         pa->next = hb->next;
 24     }
 25 }
 26 
 27 
 28 Status DeleteAndInsertSub(LinkList &la, LinkList &lb, int i, int j, int len)
 29 {
 30     LinkList p, q, s, prev = NULL;
 31     int k = 1;
 32     if (i < 0 || j < 0 || len < 0)
 33         return INFEASIBLE;
 34     p = la;
 35     while (p && k < i)
 36     {
 37         prev = p;
 38         p = p->next;
 39         k++;
 40     }
 41     if (!p)
 42         return INFEASIBLE;
 43     q=p;
 44     k = 1;
 45     while (q && k < len)
 46     {
 47         q = p->next;
 48         k++;
 49     }
 50     if (!q)
 51         return INFEASIBLE;
 52     if (!prev)
 53         la = q->next;
 54     else
 55         prev->next = q->next;
 56     if (j = 1)
 57     {
 58         q->next = lb;
 59     lb = p;
 60     }
 61     else
 62     {
 63         s = lb;
 64         k = 1;
 65         while (s && k < j - 1)
 66         {
 67             s = s->next;
 68             k++;
 69         }
 70         if (!s)
 71             return INFEASIBLE;
 72         q->next = s->next;
 73         s->next = p;
 74     }
 75     return OK;
 76 }
 77 
 78 
 79 Status ListDelete_L(LinkList &L, ElemType mink, ElemType maxk)
 80 {
 81     LinkList p, q, prev = NULL;
 82     if (mink > maxk)
 83         return ERROR;
 84     p = L
 85         prev = p;
 86     p = p->next;
 87     while (p && p-> data < maxk)
 88     {
 89         if (p->data <= mink)
 90             prev = p;
 91         p = p->next;
 92     }
 93     else
 94     {
 95         prev->next = p->next;
 96         q = p;
 97         p = p->next;
 98         free(q);
 99     }
100     }
101 return OK;
102 }
103 
104 Status ListOppose_Sq(SqList &L)
105 {
106     int i;
107     ElemType x;
108     for (i = 0; i < L.length / 2; i++)
109     {
110         x = L.elem[i];
111         L.elem[i] = L.elem[L.length - 1 - i];
112         L.elem[L.length - 1 - i] = x;
113     }
114     return OK;
115 }
116 
117 Status ListOppose_L(LinkList &L)
118 {
119     linkList p, q;
120     p = L;
121     p = p->next;
122     L - next = NULL;
123     while (p)
124     {
125         q = p;
126         p = p->next;
127         q->next = L->next;
128         L->next = q;
129     }
130     return OK;
131 }
132 Status ListOppose_L(LinkList&L)
133 {
134     Linklist p, q;
135     p = L;
136     p = p->next;
137     L->next = NULL;
138     while (P)
139     {
140         q = p;
141         p = p->next;
142         q->next = L->next;
143         L->next = q;
144     }
145     return OK;
146 }
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 struct _Node
  4 {
  5     int data;
  6     struct _Node *next;
  7 };
  8 typedef struct _Node node_t;//
  9 typedef struct _Linklist
 10 {
 11     node_t * phead;//就算下面那个结构体有一个尾指针,也不是双向,尾指针只能用来索引尾节点,没法往前索引了。只有单向,主要看方向
 12     //不是看头结点那个表头单向可以用双向也可以用
 13     node_t * ptail;
 14     int len;
 15 }Linklist;
 16 static node_t * GetNode(int i)    // 新建并初始化节点
 17 {
 18     node_t *pNode;
 19     pNode = (node_t *) malloc(sizeof(node_t));
 20     if (!pNode)
 21     {
 22         printf("Error,the memory is not enough!\n");
 23         exit(-1);
 24     }
 25     pNode->data = i;
 26     pNode->next = NULL;
 27     return pNode;
 28 }
 29 void init_list(Linklist *plist)    // 用第一个节点初始化循环单链表
 30 {
 31     node_t *p;
 32     p = GetNode(1);
 33     //  printf("The New Node is: %d\n", p -> data);   // **** TEST ****
 34     plist->phead = p;
 35     plist->ptail = p;
 36     p->next = plist->phead;
 37     plist->len = 1;
 38 }
 39 static void Create_List(Linklist *plist, int n)    // 把其余数据添加到循环单链表中
 40 {
 41     int i = 0;
 42     node_t *pNew;
 43     for (i = 2; i <= n; i++)
 44     {
 45         pNew = GetNode(i);
 46         /******** TEST ********
 47         printf("The New Node is: %d\n", pNew -> data);
 48         ******** TEST ********/
 49         plist->ptail->next = pNew;
 50         plist->ptail = pNew;
 51         pNew->next = plist->phead;
 52         plist->len++;
 53     }
 54     printf("Completes the e-way circulation chain table the foundation!\n");
 55 }
 56 void Print_List(Linklist *plist)    // 输出链表内容
 57 {
 58     node_t *pCur = plist->phead;//
 59     do
 60     {
 61         printf("The %d person.\n", pCur->data);
 62         pCur = pCur->next;
 63     } while (pCur != plist->phead);
 64     printf("The length of the List: %d\n", plist->len);
 65 }
 66 void joseph(Linklist *plist, int m)    //约瑟夫回环函数实现
 67 {
 68     node_t *pPre = plist->ptail;
 69     node_t *pCur = plist->phead;
 70     int i;
 71     while (plist->len != 1)
 72     {
 73         i = 0;
 74         while (i < m - 1)
 75         {
 76             pPre = pPre->next;
 77             i++;
 78         }
 79         pCur = pPre->next;
 80         pPre->next = pCur->next;
 81         free(pCur);
 82         plist->len--;
 83     }
 84     printf("The last one is: %d\n", pPre->data);
 85 }
 86 int main()
 87 {
 88     int n = 0;
 89     printf("Please input the Length of the Circle list: ");
 90     scanf_s("%d", &n);
 91     int m = 0;
 92     printf("Please input the Stop point: ");
 93     scanf_s("%d", &m);
 94     Linklist pList;
 95     init_list(&pList);
 96     Create_List(&pList, n);
 97     Print_List(&pList);
 98     joseph(&pList, m);
 99     system("pause");
100     return 0;
101 }

 

posted @ 2013-10-07 15:30  herizai007  阅读(330)  评论(0编辑  收藏  举报