|
发表于 2022-3-19 08:34:35
|
显示全部楼层
问题出现在你这头插法不对,在哪个CreateListL函数中
- #include <stdio.h>
- #include <malloc.h>
- typedef int DataType;
- typedef struct linknode
- {
- DataType data;
- struct linknode *next;
- }LinkList;
- LinkList *InitList()
- {
- LinkList *head;
- head=(LinkList*)malloc(sizeof(LinkList));
- head->next=NULL;
- return head;
- }
- void CreateListL(LinkList *head, int n)
- {
- LinkList *s,*last;
- int i;
- last=head;
- printf("请输入%d个整数: ",n);
- for(i=0;i<n;i++)
- {
- s=(LinkList*)malloc(sizeof(LinkList));
- scanf("%d",&s->data);
- s->next=NULL;
- last->next = s; // 头插法这出现问题
- last=s;
- }
- printf("建立链表操作成功!");
- }
- int LengthList(LinkList *head)
- {
- LinkList *p=head->next;
- int j=0;
- while(p!=NULL)
- { p=p->next;
- j++;
- }
- return j;
- }
- void Locate(LinkList *head,DataType x)
- {
- int j=1;
- LinkList *p;
- p=head->next;
- while(p!=NULL && p->data!=x)
- { p=p->next;
- j++;
- }
- if(p!=NULL)
- printf("在表的第%d位找到值为%d的结点!",j,x);
- else
- printf("未找到值为%d的结点!",x);
- }
- void SearchList(LinkList *head,int i)
- {
- LinkList *p;
- int j=0;
- p=head;
- if(i>LengthList(head))
- printf("位置错误,链表中没有该位置!");
- while(p->next!=NULL && j<i)
- {
- p=p->next;
- j++;
- }
- if(j==i)
- printf("在第%d位上的元素值为%d!",i,p->data);
- }
- void InsList(LinkList *head, int i,DataType x)
- {
- int j=0;
- LinkList *p,*s;
- p=head;
- while(p->next!=NULL && j<i-1)
- {
- p=p->next;
- j++;
- }
- if(p!=NULL)
- {
- s=(LinkList*)malloc(sizeof(LinkList));
- s->data=x;
- s->next=p->next;
- p->next=s;
- printf("插入元素成功!");
- }
- else
- printf("插入元素失败!");
- }
- void DelList(LinkList *head,int i)
- {
- int j=0;
- DataType x;
- LinkList *p=head, *s;
- while(p->next!=NULL && j<i-1)
- {
- p=p->next;
- j++;
- }
- if(p->next!=NULL && j==i-1)
- {
- s=p->next;
- x=s->data;
- p->next=s->next;
- free(s);
- printf("删除第%d位上的元素%d成功!",i,x);
- }
- else
- printf("删除结点位置错误,删除失败!");
- }
- void DispList(LinkList *head)
- {
- LinkList *p;
- p=head->next;
- while(p!=NULL)
- {
- printf("%5d",p->data);
- p=p->next;
- }
- }
- void MenuLine()
- {
- printf("\n\t\t 线性表子系统");
- printf("\n\t\t\t| =============================");
- printf("\n\t\t\t| 1——建立 |");
- printf("\n\t\t\t| 2——插入 |");
- printf("\n\t\t\t| 3——删除 |");
- printf("\n\t\t\t| 4——按位置查找 |");
- printf("\n\t\t\t| 5——按元素值查找 |");
- printf("\n\t\t\t| 6——求表长 |");
- printf("\n\t\t\t| 0——返回 |");
- printf("\n\t\t\t|==============================");
- printf("\n\t\t\t请输入菜单号(0-6): ");
- }
- main()
- {
- LinkList *head;
- DataType x;
- int i,n;
- char ch1,ch2,a;
- ch1='y';
- while(ch1=='y'|| ch1=='y')
- {
- MenuLine();
- scanf("%c",&ch2);
- getchar();
- switch(ch2)
- {
- case'1':
- head=InitList();
- printf("请输入要建立线性表的长度:");
- scanf("%d",&n);
- CreateListL(head,n);
- printf("建立后的线性表为:\n");
- DispList(head);
- break;
- case'2':
- printf("请输入要插入的元素位置:");
- scanf("%d",&i);
- getchar();
- printf("请输入要插入的元素值:");
- scanf("%d",&x);
- InsList(head,i,x);
- printf("插入元素%d后的线性表:\n",x);
- DispList(head);
- break;
- case '3':
- printf("请输入要删除的元素位置:");
- scanf("%d",&i);
- DelList(head,i);
- printf("删除第%d位的元素后的线性表为:\n",i);
- DispList(head);
- break;
- case'4':
- printf("请输入查找的元素位置(大于等于1的整数):");
- scanf("%d",&i);
- SearchList(head,i);
- break;
- case'5':
- printf("请输入查找的整数:");
- scanf("%d",&x);
- Locate(head,x);
- break;
- case '6':
- printf("该线性表的长度为%d!",LengthList(head));
- break;
- case'0':
- ch1='n';
- break;
- default:
- printf("输入有误,请输入0-9进行选!");
- }
- if(ch2!='0')
- {
- printf("\n按回车键继续,按任意键返回主菜单!\n");
- a=getchar();
- if(a!='\xA')
- {
- getchar();ch1='n';
- }
- }
- }
- }
复制代码 |
|