链表

C语言 数据结构中的链表创建,插入和删除代码

悬赏分:100 - 解决时间:2008-6-17 13:51

急求一段能运行,能编译(没一点错误,不然还要我找错误)的程序,能在c上运行的,简短的就行,只要包含了链表的创建,插入和删除就行。不用太长,越简短越好,附上注释,谢谢。比如学生成绩的输入,插入类似的问题。

提问者: 回头是岸1194 - 门吏 三级

最佳答案

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Llist;

LNode *creat_head();//
创建一个空表
void creat_list(LNode *,int);//
创建一个长度为n的线性链表
void insert_list(LNode *,int,int );//
插入一个元素
int delete_list(LNode *,int);//
删除一个元素
main()
{
LNode *head,*p;
int n;
int x,i;
int b;
clrscr();
head=creat_head();
printf("n=");scanf("%d",&n);
creat_list(head,n);

for(p=head->next;p!=NULL;)
{
printf("%d ",p->data);
p=p->next;
}

printf("/n*****************************************************/n");
printf("x=");scanf("%d",&x);
printf("/ninsert i=");scanf("%d",&i);
insert_list(head,x,i);

for(p=head->next;p!=NULL;)
{
printf("%d ",p->data);
p=p->next;
}


printf("/n*********************************************************/n");
printf("delete i=");scanf("%d",&i);

b=delete_list(head,i);

for(p=head->next;p!=NULL;)
{
printf("%d ",p->data);
p=p->next;
}

printf("/ndelete b=%d",b);

getch();
}

//
创建一个空链表
LNode *creat_head()
{
LNode *p;

p=(Llist)malloc(sizeof(LNode));

p->next=NULL;

return(p);
}

//
创建一个长度为n的线性链表
void creat_list(LNode *head,int n)
{
LNode *p,*q;
int i;
p=head;

for(i=1;i<=n;i++)
{
q=(Llist)malloc(sizeof(LNode));
printf("data:");scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p =q;
}
}

//
插入一个元素
void insert_list(LNode *head,int x,int i )
{

int j=0;
LNode *p,*s;
p=head;

while((p!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}

if(p==NULL) exit(0);

s=(Llist)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;

}


//
删除一个元素
int delete_list(LNode *head,int i)
{

LNode *p,*q;
int j=0;
int x;

p=head;

while((p!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}

if(p==NULL) exit(0);

q=p->next;
p->next=q->next;
x=q->data;
free(q);

return(x);

}

 

 

~~~数据结构用C语言创建链表

悬赏分:50 - 解决时间:2008-4-4 11:47

建一个链表[代表头的单链表或循环链表都可以]
插入新结点
删除某位置的结点
输出链表
谢谢各位高手帮个忙~~~

提问者: 蓝色百子莲 - 见习魔法师 二级

最佳答案

#include<stdio.h>
#include<stdlib.h>
typedef struct node *pointer;
struct node
{
int data;
pointer next;
};
pointer next,null,p,L,s,q;
int j,e,n,k;
creater(int n)
{
int i;
L=(struct node *)malloc(sizeof(struct node));
L->next-null;
s=L;
for(i=1;i<=n;i++)
{printf("/n
输入数据%d:",i);
scanf("%d",&k);
p=(struct node *)malloc(sizeof(struct node));
p->data=k;
s->next=p;
s=p;
}
p->next=null;
}
print()
{pointer p;
p=L->next;
while(p)
{printf("/n%d",p->data);
p=p->next;
}
printf("/n");
}
insert(int i,int e)
{if(i<1||i>n+1)printf("
不存在 i/n");
else
{j=0;p=L;
while(j<i-1)
{p=p->next;j++;}
q=(struct node *)malloc(sizeof(struct node));
q->data=e;
q->next=p->next;
p->next=q;
}
}
delete(int i,int e)
{if(i<1||i>n)printf("
不存在 i/n");
else
{j=0;p=L;
while(j<i-1)
{p=p->next;j++;}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
printf("e=%d/n",e);
}
}
main()
{int i=1;
while(i)
{printf(" 1--
代表建立新的链表 /n");
printf(" 2--
代表添加元素/n");
printf(" 3--
代表删除元素/n");
printf(" 4--
代表输出当前表中的元素/n");
printf(" 0--
代表退出/n");
printf("
请选择!/n");
scanf("%d",&i);
switch(i)
{case 1:printf("n="); /*
初始化链表的时候,n代表你想要输入的数据个数*/
scanf("%d",&n);
creater(n);
print();break;
case 2:printf("i=");
scanf("%d",&i);
printf("input e");
scanf("%d",&e);
insert(i,e);
print();break;
case 3:printf("i=");
scanf("%d",&i);
delete(i,e);
print();break;
case 4:print();break;
case 0:return;break;
default:printf("ERROR!Try again!/n/n");
}
}
getch();
}

 

 

 

C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成!

悬赏分:5 - 解决时间:2007-4-2 22:42

提问者: qiuhzhou - 试用期 一级

最佳答案

以前给别人做的一个链表,给你用功能富裕了你看看吧:

#include "stdio.h"
struct Node
{
Node *pNext;
int value;
}*pTop;


struct Node* Insert(struct Node *pNode,int Num);
void Del(struct Node *pDelNode);
struct Node* Search(struct Node *pNode,int Num);

void main()
{
pTop=NULL;
int i,k,x,y;
struct Node *pCurrentNode,*pTempNode;

/*
1)建立带表头结点的单链表;*/
for(i=0;i<30;i++) Insert(NULL,i);/*
建立一个有30个结点的链表*/

/*
2)输出单链表中所有结点的数据域值;*/
pCurrentNode=pTop;
while(pCurrentNode!=NULL)
{
printf("%d->",pCurrentNode->value);/*
遍历这个链表并输出其各结点的数据域*/
pCurrentNode=pCurrentNode->pNext;
}

/*
3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;*/
printf("Input x,y");
scanf("%d,%d",&x,&y);
pCurrentNode=Search(NULL,x);
Insert(pCurrentNode,y);

/*
4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。 */
printf("Input k");
scanf("%d",&k);
pCurrentNode=pTop;
i=0;
while(1)
{
pTempNode=Search(pCurrentNode,x);
if(pTempNode!=NULL)
{
pCurrentNode=pTempNode->pNext;
Del(pTempNode);
i++;
}
else break;
}
printf("%d Nodes was deleted",i);

pTempNode=pTop;
while(pTop!=NULL)
{
pTop=pTempNode->pNext;
delete pTempNode;
}
}

Node* Insert(struct Node *pNode,int Num)
{
struct Node *pNewNode;
pNewNode=new Node;
pNewNode->value=Num;
if(pNode==NULL)/*
无确定插入位置时将结点放在链表最后*/
{
if(pTop!=NULL)/*
确定链表是否是空表*/
{
pNode=pTop;
while(pNode->pNext!=NULL) pNode=pNode->pNext;/*
找到尾结点*/
pNode->pNext=pNewNode;
}
else
{
pTop=pNewNode;
}
pNewNode->pNext=NULL;
}
else/*
有确定插入位置时将结点放在指定结点之后*/
{
pNewNode->pNext=pNode->pNext;
pNode->pNext=pNewNode;
}
return pNewNode;
}

void Del(struct Node *pDelNode)
{
if(pDelNode==NULL || pTop==NULL) return;/*
防错处理*/
struct Node *pNode;
pNode=pTop;
while(pNode!=NULL && pNode->pNext!=pDelNode) pNode=pNode->pNext;/*
找到指定结点的前导结点*/
if(pNode!=NULL)
{
pNode->pNext=pDelNode->pNext;
delete pDelNode;
}
}

struct Node* Search(struct Node *pNode,int Num)
{
struct Node *pSeaNode;
if(pNode==NULL) pSeaNode=pTop;/*
不指定搜索的起始位置,从表头开始*/
else pSeaNode=pNode;/*
指定了搜索的起始位置,从指定位置开始*/
while(pSeaNode!=NULL && pSeaNode->value!=Num) pSeaNode=pSeaNode->pNext;
return pSeaNode;/*
没有找到结点时返回空指针*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值