读书人

单循环链表!解决办法

发布时间: 2012-04-28 11:49:53 作者: rapoo

单循环链表!
/*题目:假设在长度大于1的单循环链表中,既无头结点也无头指针。S为指向链表中某个结点
的指针,试编写算法删除结点*s 的直接前驱结点。*/ 貌似我连题目也没有读懂,就胡乱写了一个!高手帮忙解释一下!
下面的程序是算法问题,帮忙修正!或者按题目要求另写一个!谢谢~

C/C++ code
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define OK 1#define OVERFLOW -2#define ERROR 0typedef int ElemType;typedef int Status;typedef struct LNode{   ElemType data;   struct LNode *next; }LNode,*LinkList;///创建链表 Status CreateList(LinkList &L,int n){   int i;   L=(LinkList)malloc(sizeof(LNode));   LinkList L1=L;   if(!L)exit(ERROR);          L1->next=NULL;   printf("Please input numbers:\n");   for(i=0;i<n;i++)   {        scanf("%d",&L1->data);      if(i==n-1)          L1->next=L;//L1->next=NULL;      else      {        LinkList p=(LinkList)malloc(sizeof(LNode));        L1->next=p;        L1=p;       }    }     return OK; } ///输出元素 Status PrintList(LinkList L,int m){  int i=1;   printf("The numbers are:");  while(L)  {    printf("%d ",L->data);    if(i>=m) break;     if(L->next)            {L=L->next;i++; }     else        break;  }   printf("\n");   return OK; } ///删除结点*s 的直接前驱结点Status DeleteList(LinkList &L,LinkList s){  //int locat=0;   LinkList p,q;//=(LinkList)malloc(sizeof(LNode));  p=s;  //LinkList s=(LinkList)malloc(sizeof(LNode));  //s->data=e;   while(p->next->next!=s)  {     q=p;     p=p->next;    free(s);     return OK;   }   q->next=s;  free(q);  return OK; }  //主函数  int main() {     int n,slocat;     ElemType e;      LinkList L,s;     printf("Please input the number you need:");      scanf("%d",&n);      CreateList(L,n);      PrintList(L,n);     printf("请输入结点S的位置:");     scanf("%d",&slocat);     DeleteList(L,s);     n=n-1;      PrintList(L,n);     system("pause");  } 




[解决办法]
学习学习学习


[解决办法]
循环单链表创建那块有问题,另外,添加了一个根据data域值定位节点的函数。
C/C++ code
/*题目:假设在长度大于1的单循环链表中,既无头结点也无头指针。S为指向链表中某个结点的指针,试编写算法删除结点*s 的直接前驱结点。*/ #include<stdio.h>#include<stdlib.h>#define OK 1#define OVERFLOW -2#define ERROR 0typedef int ElemType;typedef int Status;typedef struct LNode{   ElemType data;   struct LNode *next;} LNode, *LinkList;///创建链表 Status CreateList(LinkList &L,int n){   int i;   ElemType data;    L=(LinkList)malloc(sizeof(LNode));   LinkList L1=L;   if(!L)    exit(ERROR);          L1->next=NULL;   printf("Please input numbers:\n");   for(i=0;i<n;i++)   {        //scanf("%d",&L1->data);      scanf("%d", &data);      if(i == 0) {          L1->data = data;      }      /*      else if(i==n-1) {          L1->next=L;//L1->next=NULL;      }      */      else      {        LinkList p=(LinkList)malloc(sizeof(LNode));        p->data = data;        L1->next=p;        L1=p;       }      L1->next=L;    }     return OK; } ///输出元素 Status PrintList(LinkList L,int m){  int i=1;   printf("The numbers are:");  while(L)  {    printf("%d ",L->data);        if(i>=m) break;     if(L->next)           {L=L->next;i++; }     else        break;  }   printf("\n");   return OK; } ///删除结点*s 的直接前驱结点Status DeleteList(LinkList &L,LinkList s){  //int locat=0;   LinkList p,q;//=(LinkList)malloc(sizeof(LNode));  p=s;  //LinkList s=(LinkList)malloc(sizeof(LNode));  //s->data=e;   //while(p->next->next!=s)  while(p->next!=s)  {     q=p;     p=p->next;    //free(s);     //return OK;   }   if(p == L) {     L = L->next;  }  q->next=s;  //free(q);  free(p);  return OK; }   ///从头结点开始查找第一个data域为e的节点LinkList FindList(LinkList &L, ElemType e){   LinkList p = L;  while(p->data!=e && p->next != L)  {       p = p->next;  }   if(p->data == e) {     return p;  }  else {     return NULL;  }}  //主函数  int main() {     int n,slocat;     ElemType e;      LinkList L,s;     printf("Please input the number you need:");      scanf("%d",&n);      CreateList(L,n);      PrintList(L,n);     /*     printf("请输入结点S的位置:");     scanf("%d",&slocat);     DeleteList(L,s);     n=n-1;      PrintList(L,n);     */     printf("请输入要删除节点的后一个节点data域值: \n");     scanf("%d",&e);     s = FindList(L, e);     if(s != NULL) {         DeleteList(L, s);         n=n-1;          PrintList(L,n);     }     else {        printf("没找到数据域为%d的节点!\n", e);     }     system("pause");  } 


[解决办法]

探讨
循环单链表创建那块有问题,另外,添加了一个根据data域值定位节点的函数。

C/C++ code

/*题目:假设在长度大于1的单循环链表中,既无头结点也无头指针。S为指向链表中某个结点
的指针,试编写算法删除结点*s 的直接前驱结点。*/

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define OVERFL……

[解决办法]
顶楼上
[解决办法]
算法都大同小异。。。

读书人网 >C语言

热点推荐