#include<stdlib.h>
typedef struct Node
{
int element
struct Node *link
} Node
typedef struct SingleList
{
struct Node *first
int n
} SingleList
void mulu()
{
printf("请根据以下提示 *** 作:\n")
printf("1. 检索一个位置上的元素\n")
printf("2. 定位插入一个元素\n")
printf("3. 定位删除一个元素\n")
printf("4. 撤销\n")
printf("ATTENTION:本链表序号从0开始!!!!!!\n")
}
void Init(SingleList *list)
{
list->first=NULL
list->n=0
}
void Find(SingleList L,int i,int* x)
{
Node *p
if(i<0 || i>L.n-1)
{
printf("超出范围!\n")
return
}
p=L.first
for(int j=0j<ij++)
{
*x=p->element
p=p->link
}
}
void Insert(SingleList *L,int i,int x)
{
Node *p,*q
if(i<-1 || i>L->n)
{
printf("超出范围!\n")
return
}
p=L->first
for(int j=0j<ij++)
{
p=p->link
}
q=(Node*)malloc(sizeof(Node))
q->element=x
if(i>-1 && i<L->n)
{
q->link=p->link
p->link=q
}
else if(i==L->n)
{
q->link=NULL
p->link=q
}
else if(i==-1)
{
q->link=L->first
L->first=q
}
L->n++
}
void Delete(SingleList *L,int i)
{
Node *p
if(i<0 || i>L->n-1)
{
printf("超出范围!\n")
return
}
p=L->first
for(int j=0j<ij++)
{
p=p->link
}
if (i==0)
{
L->first=p->link
}
else
{
p->link=p->link->link
}
L->n--
}
void Output(SingleList L)
{
Node *p
if(!L.n)
{
return
}
p=L.first
while(p)
{
printf("%d, ",p->element)
p=p->link
}
}
void Destroy(SingleList *L)
{
Node *p
while(L->first)
{
p=L->first->link
free(L->first)
L->first=p
}
}
int main()
{
int i=0,n=0
int x=0,size=0
SingleList list
printf("请输入线性表的数据个数:")
scanf("%d",&size)
Init(&list)
list.n=size
list.first=(Node*)malloc(sizeof(Node))
for(int j=0 j<size j++)
{
Insert(&list, j, 0)
list.n--
}
printf("\n")
mulu()
while(1)
{
printf("请按照目录的提示完成 *** 作:")
scanf("%d",&n)
switch(n)
{
case(1):
{
printf("请输入要查询的位置:")
scanf("%d",&i)
Find(list,i,&x)
printf("%d\n",x)
system("pause")
break
}
case(2):
{
printf("请输入位置和值,中间用一个空格间隔:")
scanf("%d %d",&i,&x)
Insert(&list,i,x)
system("pause")
break
}
case(3):
{
printf("请输入要删除的位置:")
scanf("%d",&i)
Delete(&list,i)
system("pause")
break
}
case(4):
{
Destroy(&list)
system("pause")
break
}
}
}
return 0
}
这是一个简单单链表的实例,用的不是类是结构体,但是总体思路是和结构是相同的。
希望可以帮到你
这是一个地址传递出现的错误,怎样才能避免这样的错误呢,还得从本质上去看指针和真实的值之间的联系和区别,认真区分两者之间的不同。#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data
struct node *next
}slink
void createlisk(slink *L,int *a,int n)
int main(void)
{
int a[3]={1,2,3},i
slink L,*p
createlisk(&L,a,3)//这里做了点修改,是因为只有申请的实质的变量,这样才能得到他的地址
p=&L
for(i=0i<3i++)
{
p=p->next
printf("%d\n",p->data)
}
}
void createlisk(slink *L,int *a,int n)
{
slink *s,*r
int i
s=(slink *)malloc(sizeof(slink)) //为L指针开辟一条内存区//-----------------------这个地方你就不应该用L来开空间,这样就把传进来的首节点的地址给弄丢了
s->next=NULL//将L执行的下一个指针置为空
r=L//把L的地址给r,除非将另外一个地址给了r,否则 *** 作r就等于 *** 作了L
for(i=0i<ni++)
{
s=(slink *)malloc(sizeof(slink))
s->data=*(a+i)
r->next=s //当i=0时,这时候L->next就存储s的地址
r=s//把s的地址给r,此后对r *** 作并不对L产生变化
}
s->next=NULL//把r执行的地址置为null
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)