C语言数据结构单链式线性表问题
麻烦大家帮我找找错误,插入元素和删除元素那块,如果输入和删除元素在线性表有的话,运行没问题,但是当输入错误的时候程序就有问题了。。
#include<stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkedList;
LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值
{
ElemType x;
LinkedList L,s,r;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
r=L;
printf("请对单链表进行整型赋值,以9999结束\n");
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
scanf("%d",&x);
}
if(r!=NULL) r->next=NULL;
return L;
}
void Listoutput(LinkedList L)//遍历输出单链表元素
{
LinkedList p;
p=L->next;
printf("遍历单链表为:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int LinkedListLength(LinkedList L)//求出单链表的长度
{
LinkedList p;int j=0;
p=L->next;
while(p)
{
j++;
p=p->next;
}
return j;
}
int LinkedListEmpty(LinkedList L)//判断单链表是否为空
{
return (L->next==NULL?1:0);
}
int LinkedListLocate(LinkedList L,ElemType x)//查找某元素并定位
{
LinkedList p;
int j;
j=1;
p=L->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
j++;
}
if(p->data==x) return j;
else
return 0;
}
LinkedList ListkedListInsert(LinkedList L,int i,ElemType e)//插入元素
{ //在带头节点单链表第i个节点前插入新元素e
int j=0;LinkedList s,p;
p=L;
while((p!= NULL)&&(j<i-1))
{
p=p->next;
j++;
}
if((p==NULL)||(j>i-1)) {printf("序号不合理\n");exit(0);}
else
{
s = (LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
return L;
}
LinkedList ListkedListDelete(LinkedList L,ElemType e)//删除元素
{
int j=0,i=0;
LinkedList p,pre;
if(L->next==NULL) {printf("该表为空,无法删除");exit(0);}
p=L->next;pre=L;
while(p!=NULL&&p->data!=e)
{
j++;
p=p->next;
}
if(p->data!=e) printf("对不起,你所删除的元素不存在\n");
else
while(pre->next&&i<j)//寻找删除元素结点的前驱
{
pre=pre->next;
i++;
}
p=pre->next;
pre->next=p->next;
free(p);
return L;
}
void main()
{
LinkedList L;
int b,a,c;
L=LinkedListset();
Listoutput(L);
if(LinkedListEmpty(L))
printf("表为空\n");
else printf("表不为空\n");
printf("单链式顺序表的长度为:%d\n",LinkedListLength(L));
printf("请输入你要查找的元素\n");
scanf("%d",&b);
printf("该元素在线性表中第%d位\n",LinkedListLocate(L,b));
printf("请输入你要插入的元素的位置\n");
scanf("%d",&c);
printf("请输入你要插入的元素\n");
scanf("%d",&a);
L=ListkedListInsert(L,c,a);
Listoutput(L);
printf("请输入你要删除的元素\n");
scanf("%d",&a);
L=ListkedListDelete(L,c);
Listoutput(L);
}
[解决办法]
#include<stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct Node{ ElemType data; struct Node *next;}LNode,*LinkedList;LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值{ ElemType x; LinkedList L,s,r; L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; r=L; printf("请对单链表进行整型赋值,以9999结束\n"); scanf("%d",&x); while(x!=9999) { s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=r->next; r->next=s; r=s; scanf("%d",&x); } if(r!=NULL) r->next=NULL; return L;}void Listoutput(LinkedList L)//遍历输出单链表元素{ LinkedList p; p=L->next; printf("遍历单链表为:\n"); while(p) { printf("%d ",p->data); p=p->next; } printf("\n");}int LinkedListLength(LinkedList L)//求出单链表的长度{ LinkedList p;int j=0; p=L->next; while(p) { j++; p=p->next; } return j;}int LinkedListEmpty(LinkedList L)//判断单链表是否为空{ return (L->next==NULL?1:0);}int LinkedListLocate(LinkedList L,ElemType x)//查找某元素并定位{ LinkedList p; int j; j=1; p=L->next; while(p!=NULL&&p->data!=x) { p=p->next; j++; } if(p!=NULL && p->data==x) return j; else return 0;}LinkedList ListkedListInsert(LinkedList L,int i,ElemType e)//插入元素{ //在带头节点单链表第i个节点前插入新元素e int j=0;LinkedList s,p; p=L; while((p!= NULL)&&(j<i-1)) { p=p->next; j++; } if((p==NULL)||(j>i-1)) {printf("序号不合理\n");exit(0);} else { s = (LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } return L;}LinkedList ListkedListDelete(LinkedList L,ElemType e)//删除元素{ int j=0;LinkedList s,p; int nPos = LinkedListLocate(L,e); if (nPos==0) { printf("Not existing this elements\n\n"); return L; } p = L; for (j=1;j<nPos;++j) { p=p->next; } s = p->next; p->next = s->next; free(s); return L;}void main(){ LinkedList L; int b,a,c; L=LinkedListset(); Listoutput(L); if(LinkedListEmpty(L)) printf("表为空\n"); else printf("表不为空\n"); printf("单链式顺序表的长度为:%d\n",LinkedListLength(L)); printf("请输入你要查找的元素\n"); scanf("%d",&b); printf("该元素在线性表中第%d位\n",LinkedListLocate(L,b)); printf("请输入你要插入的元素的位置\n"); scanf("%d",&c); printf("请输入你要插入的元素\n"); scanf("%d",&a); L=ListkedListInsert(L,c,a); Listoutput(L); printf("请输入你要删除的元素\n"); scanf("%d",&a); L=ListkedListDelete(L,a); Listoutput(L); printf("请输入你要删除的元素\n"); scanf("%d",&a); L=ListkedListDelete(L,a); Listoutput(L);}
[解决办法]
LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值{ElemType x;LinkedList L,s,r;L=(LNode*)malloc(sizeof(LNode));L->next=NULL;r=L;printf("请对单链表进行整型赋值,以9999结束\n");scanf("%d",&x); while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=r->next;r->next=s;r=s;scanf("%d",&x);}// if(r!=NULL) r->next=NULL; //-------------------- 画蛇添足!你这样就将链表截断了return L;}
[解决办法]
//链表的创建 插入 删除
# include <stdio.h>
# include <malloc.h>
typedef struct node
{
int num;
char name[10];
struct node *next;
}NODE;
void creat(NODE *head,int n)
{
NODE *p;
scanf("%d",&head->num);
while(--n)
{
p=(NODE *)malloc(sizeof(NODE));
scanf("%d",&p->num);
head->next=p;
head=head->next;
}
head->next=NULL;
}
void output(NODE *head)
{
while(head!=NULL)
{
printf("%d ",head->num);
head=head->next;
}
printf("\n");
}
NODE *dele(NODE *head,int n)
{
NODE *p=head;
if(n==1)return head->next;
n-=2;
while(n--)head=head->next;
head->next=head->next->next;
return p;
}
NODE *insert(NODE *head,int n,int m)
{
NODE *p=head,*q;
q=(NODE *)malloc(sizeof(NODE));
if(n==1){q->next=head;q->num=m;return q;}
n-=2;
while(n--)head=head->next;
q->next=head->next->next;
head->next=q;
q->num=m;
return p;
}
void main()
{
NODE *head,*p;
printf("creat:");
creat(head,5);
output(head);
printf("\ndele:");
p=dele(head,2);
output(p);
printf("\ninsert:");
p=insert(p,2,33);
output(p);
getch();
}