#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
InitList(LinkList *L)
{
*L = (Node*)malloc(sizeof(Node));
if (L==NULL)
{
printf("申請記憶體空間失敗\n");
}
(*L)->next=NULL;
}
void CreateFromHead(LinkList L,int n)//頭插法插入
{
Node *p,*q,*s;
int i,j=1;
p=L;
s=(Node*)malloc(sizeof(Node));
s->data=https://bbs.csdn.net/topics/n;
for(i=1;n>=p->next->data;i++)//回圈,找第一個大于新結點的結點
p=p->next;//回圈指標后移 回圈結束時,i記錄第一個大于新結點的結點序號
p=L;//p重新指向頭結點
while(j<=i) //再次回圈、找到比新結點的值小的最大結點地址
{
q=p;p=p->next; //用q記錄前驅,p記錄后繼
j++; //改變回圈變數
}
s->next=q->next; //把比新結點大的第一個結點連在新結點后
q->next=s; //把新結點連在比它小的最后一個結點后
}
Node* Locate(LinkList L,ElemType key)//單鏈表中查找值為key的值
{
Node*p;
p=L->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else break;
return p;
}
int DelList(LinkList L,int i,ElemType *e)
{
Node *pre,*r;
int k;
pre=L;k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next==NULL)
{
printf("洗掉節點不合理");
return 0;
}
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);//釋放記憶體空間
return 1;
}
void OutputList(LinkList L)
{
LinkList p=L;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n\n");
}
int main()
{
LinkList L,start;// head=NULL;
int num,i,da,k;
//逐個插入保持有序
printf("請輸入資料個數");
scanf("%d",&num);
for(i=0;i<num;i++)
{
scanf("%d",&da);
CreateFromHead(L,da);
}
//查找,若找到就洗掉
//輸出
OutputList(L);
}
uj5u.com熱心網友回復:
學會除錯uj5u.com熱心網友回復:
L、q指標沒有初始化uj5u.com熱心網友回復:
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
//InitList(LinkList *L)
void InitList(LinkList *L)
{
*L = (Node*)malloc(sizeof(Node));
if (L==NULL)
{
printf("申請記憶體空間失敗\n");
}
(*L)->next=NULL;
}
void CreateFromHead(LinkList L,int n)//頭插法插入
{
Node *p,*q,*s;
int i,j=1;
p=L;
s=(Node*)malloc(sizeof(Node));
if (!s) //安全考慮
exit(0);
s->data = n;
//for(i=1;n>=p->next->data;i++)//回圈,找第一個大于新結點的結點
for(i=1;p->next && n>=p->next->data;i++)//回圈,找第一個大于新結點的結點
p = p->next;//回圈指標后移 回圈結束時,i記錄第一個大于新結點的結點序號
p = L;//p重新指向頭結點
while(j <= i) //再次回圈、找到比新結點的值小的最大結點地址
{
q=p;
p=p->next; //用q記錄前驅,p記錄后繼
j++; //改變回圈變數
}
s->next=q->next; //把比新結點大的第一個結點連在新結點后
q->next=s; //把新結點連在比它小的最后一個結點后
}
//Node* Locate(LinkList L,ElemType key)//單鏈表中查找值為key的值
Node* Locate(LinkList L,ElemType key)//單鏈表中查找值為key的節點
{
Node*p;
p = L->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else
break;
return p;
}
int DelList(LinkList L,int i,ElemType *e)
{
Node *pre,*r;
int k;
pre=L;k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next==NULL)
{
printf("洗掉節點不合理");
return 0;
}
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);//釋放記憶體空間
return 1;
}
void OutputList(LinkList L)
{
LinkList p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n\n");
}
int main()
{
LinkList L,start;// head=NULL;
int num,i,da,k;
//逐個插入保持有序
printf("請輸入資料個數");
scanf("%d",&num);
InitList(&L); //少了這一步,定義了為什么不呼叫呢?
for(i=0;i<num;i++)
{
scanf("%d",&da);
CreateFromHead(L,da);
}
//查找,若找到就洗掉
//輸出
OutputList(L);
}
供參考~
對比代碼找一下自己的問題~
uj5u.com熱心網友回復:
謝謝你啊!!你的注釋我覺得我搞懂了!我仔細看了幾遍。謝謝大佬
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/204000.html
標籤:C語言
