数据结构题目,建立一个10个节点的链表,然后删除第5个节点,查找第7个节点并打印,c语言啊!!求解

如题所述

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct date{
int date;
struct date *next;
}Date;
void main()
{
Date *head=NULL,*p1,*p2,*p;
int i;
srand(time(NULL));//使用随机数为每个节点赋值
p2=p1=(Date *)malloc(sizeof(Date));
p1->date=rand()%20+1;
for(i=0;i<9;i++)//建立链表
{
if(head==NULL)head=p1;
else
{
p2=p1;
}
p1=(Date *)malloc(sizeof(Date));
p1->date=rand()%20+1;
p2->next=p1;
}
p1->next=NULL;//链表建立完成
printf("下面是刚才建立的链表:\n");
p=head;
while(p!=NULL) //打印链表
{
printf("%d ",p->date);
p=p->next;
} //打印链表完成
printf("\n下面是删除第5个节点的链表:\n");
p1=p2=head;
for(i=0;i<4;i++)//找到第五个节点p1,p2自相第四个节点,也就是p2->next=p1
{
p2=p1;
p1=p1->next;
}
p2->next=p1->next;//删除第五个节点,即让第四个节点指向第六个节点
p=head;
while(p!=NULL) //打印删除第五个节点后的链表
{
printf("%d ",p->date);
p=p->next;
} //打印链表完成
p=head;
for(i=0;i<6;i++)//找到第七个节点p
{
p=p->next;
}
printf("\n第七个节点的内容是:");
printf("%d\n",p->date);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-08
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int ElemType;
/////////////////////////
#define OK 0
#define ERROR -1
typedef struct LNode
{
ElemType data;//指向的数据域
struct LNode *next;//指针域

}LNode,*LinkList;

//******************函数的定义**************************
int InitList(LinkList *L)
{ (*L)=(LinkList)malloc(sizeof(struct LNode));
if(!(*L))
exit(0);
(*L)->next;
return 1;
}//构造空的单链表;

int ListInsert(LinkList L,int i,ElemType e)
{ LinkList p=L,s;
int j=0;
while(p&&j<i-1)////————————————————————
{ p=p->next;
j++;
}
if(!p||j>i-1){return 0;}

s=(LinkList)malloc(sizeof(struct LNode));
s->data=e;
s->next=p->next;/////////——————————————————
p->next=s;
return 1;
}//插入元素

GetList_L(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i) exit(0);
e=p->data;
return 1;
}//获取元素

////////////////////////////
LinkList createllist(int *array,int len) {
LinkList head;
LinkList ptr,ptr1;
int i;
head = (LinkList)malloc(sizeof(LNode));
if(!head) return NULL;
head->data = array[0];
head->next = NULL;
ptr = head;
for(i = 1;i < len;i++) {
ptr1 = (LinkList)malloc(sizeof(LNode));
if(!ptr1) return NULL;
ptr1->data= array[i];
ptr->next = ptr1;
ptr = ptr1;
}
ptr->next = NULL;
return head;
}
////////////////////////////////////////////
void printfllist(LinkList ptr) {
while(ptr != NULL) {
printf("%d ",ptr->data);
ptr = ptr->next;
}
printf("\n");
}
////////////////////////////
////////////////////////////////////
ElemType ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p= (LinkList)malloc(sizeof(LNode));
LinkList q= (LinkList)malloc(sizeof(LNode));
p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
return OK;
}
int main()
{
int llist1[1] = {0};
LinkList La;
ElemType e,e1;
int i;
//InitList(&La);
La = createllist(llist1,1);

printf("La为:\n");
////////建立链表
for(i=1;i<=10;i++)
{
ListInsert(La,i,i);
}
///////打印整个链表0代表头结点,不是第一个元素,第一是从下一个算起
printfllist(La);
/////获取第七个个元素

GetList_L(La,7,e);
printf("第七个元素 %d\n",e);
///删除第五个元素
ListDelete_L(La,5,e1);
printf("第五个元素%d\n",e1);
///////打印整个链表此时已经删除第五个元素了
printf("删除第五个元素的链表:\n");
printfllist(La);
printf("\n");
return 0;

}
第2个回答  2011-11-08
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;

void Insert(LNode &L,ElemType e)
{
LNode *p,*q;
p=&L;
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
}
void GetElemLinkList(LNode L)
{
ElemType e;
int i;
LNode *p;
p=&L;
for(i=0;i<7;i++)
{
p=p->next;
}
e=p->data;
printf("第7个元素为:%d\n",e);
}
void Delete_i(LNode &L)
{
int j=1;
ElemType e;
LNode *p,*q;
q=&L;
p=L.next;
while(p&&j<5)
{
q=p;
p=p->next;
j++;
}
if(p!=NULL&&j==5)
{
e=p->data;
q->next=p->next;
free(p);
printf("已删除第五个!\n");
}
else
printf("Can't find !\n");

}
void DisplayLinkList(LNode L)
{
LNode *p;
p=L.next;
while(p)
{
printf("%d-->",p->data);
p=p->next;
}
printf("NULL!\n");
}

void main()
{
ElemType e;
LNode L1;
L1.next=NULL;
int i;
for(i=0;i<10;i++)
{
printf("输入数据:");
scanf("%d",&e);
Insert(L1,e);
}
DisplayLinkList(L1);
GetElemLinkList(L1);
Delete_i(L1);
DisplayLinkList(L1);
}
第3个回答  2011-11-08
#include<stdio.h>
#include<malloc.h>
struct LNode
{
int data;
LNode *next;
};
typedef LNode *LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList L,int i,int e);
void ListTraverse(LinkList L);
int ListDelete(LinkList L,int i,int &e);
int GetElem(LinkList L,int i,int &e);
int main(void)
{
LinkList L;
int j;
int i;
int e;
InitList(L);
for(j=10;j>=1;j--)
i=ListInsert(L,1,j);
printf("在L的表头依次插入1~5后:L=");
ListTraverse(L);
ListDelete(L, 5, e);
printf("删除的第五个元素是:%4d\n",e);
ListTraverse(L);
GetElem(L,7,e);
printf("第七个元素的值是:%4d\n",e);
return 0;
}

void InitList(LinkList &L)
{ // 操作结果:构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
if(!L) // 存储分配失败
exit(0);
L->next=NULL; // 指针域为空
}
int ListInsert(LinkList L,int i,int e) // 不改变L
{ // 在带头结点的单链线性表L中第i个位置之前插入元素e
int j=0;
LinkList p=L,s;
while(p&&j<i-1) // 寻找第i-1个结点
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小于1或者大于表长
return 0;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return 1;
}
void ListTraverse(LinkList L)

{ // 初始条件:线性表L已存在。操作结果:输出L
LinkList p=L->next;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
int ListDelete(LinkList L,int i,int &e) // 不改变L
{ // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前驱
{
p=p->next;
j++;
}
if(!p->next||j>i-1) // 删除位置不合理
return 0;
q=p->next; // 删除并释放结点
p->next=q->next;
e=q->data;
free(q);
return 1;
}
int GetElem(LinkList L,int i,int &e) //
{ // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回0
int j=1; // j为计数器
LinkList p=L->next; // p指向第一个结点
while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
{
p=p->next;
j++;
}
if(!p||j>i) // 第i个元素不存在
return 0;
e=p->data; // 取第i个元素
return 1;
}

将上面的代码复制就可运行,有问题请留言。
还是多学学数据结构啊,祝你好运。
相似回答