求C语言 数据结构中的链表创建,插入和删除代码
悬赏分:100 - 解决时间:2008-6-17 13:51
急求一段能运行,能编译(没一点错误,不然还要我找错误)的程序,能在c上运行的,简短的就行,只要包含了链表的创建,插入和删除就行。不用太长,越简短越好,附上注释,谢谢。比如学生成绩的输入,插入类似的问题。
最佳答案
#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
最佳答案
以前给别人做的一个链表,给你用功能富裕了你看看吧:
#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;/*没有找到结点时返回空指针*/
}