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