请用c语言(记住请用c语言,不要用c++更不要用JAVA)建立十个结点的链表

请用c语言(记住请用c语言,不要用c++更不要用JAVA)建立十个结点的链表并输出,找到第五个元素并输出,删除第七个元素再输出(请尽可能是好懂的程序)

第1个回答  2011-11-10
#include <stdio.h>
#include <stdlib.h>
#define DATA int
//此处假设节点中数据为int型

struct node
{
DATA date;
struct node *next;
};

int main()
{
//函数声明
struct node *creatList(int n);
void printList(struct node* head);
void printNode(struct node* head, int n);
void deleteListNode(struct node* head, int n);

struct node *head = creatList(10); //创建10个结点的链表
printList(head); //输出链表p
printNode(head, 5); //输出第5个元素
deleteListNode(head, 7); //删除第7个元素
printList(head); //输出链表p

return 0;
}

//创建长度为n的链表
struct node *creatList(int n)
{
int i;
struct node* head, *p, *q;

printf("请依次输入%d个结点的值(整型),以空格隔开>>\n",n);
head = (struct node* )malloc(sizeof(struct node));
scanf("%d",&head->date);
q = head;
for(i=1; i<10; i++)
{
p = (struct node* )malloc(sizeof(struct node));
scanf("%d",&p->date);
q->next = p;
q = p;
}
p->next = NULL;

return head;
}

//输出链表head
void printList(struct node* p)
{
printf("\n链表中结点的值依次为:");
while(p != NULL)
{
printf("%d ", p->date);
p = p->next;
}
printf("\n");
}

//输出第n个元素
void printNode(struct node* p, int n)
{
int i;
for(i=1; i<n; i++)
{
p = p->next;
}
printf("第%d个结点的值为:%d\n", n, p->date);
}

//删除第n个元素
void deleteListNode(struct node* p, int n)
{
int i;
struct node* q = NULL;
for(i=1; i<n-1; i++) //寻找第n-1个结点
{
p = p->next;
}
q = p->next;
p->next = q->next;
printf("链表中第%d个结点已被删除,其值为%d", n, q->date);
free(q);
}
第2个回答  2011-11-19
#include <stdio.h>
#include <stdlib.h>
#define Max_Link_Num 10
typedef char ElemType;
typedef struct LNode{

ElemType date;
LNode *next;

}LNode,*LinkList;//构造结点结构体。
int CreateLink(LinkList &L)
{
//构造一个结点个数为10的链表L;
LinkList p=L;
int i;
L=(LinkList)malloc(sizeof(LNode));//先建立一个带头结点的单链表。
L->next=NULL;
for(i=0;i<=10;i++)
{
p=(LinkList)malloc(sizeof(LNode));//生成新结点。
p->date=rand()%100;//随机产生一个100以内的整数赋值给当前结点的数据域date;
p->next=L->next;
L->next=p;
}

return 1;

}
void PrintLink_L(LinkList &L)
{ //打印链表L所有的元素。
LinkList p=L->next;
while(p->next)
{
printf("%d,",p->date);
p=p->next;
}
printf("\n");
}
void DelLink_L(LinkList &L,int i=7)
{
//删除第i个元素。
LinkList p=L;
int j=0;

for(;j<i-1;j++)p=p->next;//寻找第i个结点。
p->next=p->next->next;
}
void LocateLink_L(LinkList L)
{
//提取第5个元素,并输出。
int i=0;
for(;i<5;i++)L=L->next;//寻找第个结点。
printf("链表L的第5个元素为:%d\n",L->date);
}
void main()
{
LinkList L;

CreateLink(L);//构造一个结点为10的链表L。
printf("链表L各个元素为:\n");
PrintLink_L(L);//输出链表L。
LocateLink_L(L);//输出第5个元素。
DelLink_L(L);//删除第七个元素。
printf("删除第个7元素后链表各个元素为:\n");
PrintLink_L(L);//输出删除七个元素的链表。

}
第3个回答  2011-11-09
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/*构建结点结构体 */
typedef struct LNode{
int data;
struct LNode * next;
}LNode, * LinkList;
/*用于创建链表的函数 */
/*反序构建的*/
LinkList CreateList_L(LinkList L, int n)
{
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return L;
}

/* 用于删除结点的函数 */

LinkList ListDelete_L(LinkList L, int i)
{
LinkList p = L;
for(int j=0; j<i; j++){
p = p->next;
}
printf("%s%d\n","被删除的结点是:",p->data);
return L;
}
/*用于遍历链表的函数 */
void ListDisp_L(LinkList L)
{
LinkList p;
int i=0;
p = L->next;

while(p)
{
printf("%d:%d\n", ++i,p->data);
p = p->next;
}

}
int main(int argc, char* argv[])
{
LinkList L;
L = CreateList_L(L, 10);
ListDisp_L(L);
LNode* tmp = L;
for(int i=0; i<5; i++)
tmp++;
printf("第五个元素为:%d", tmp->data);
L = ListDelete_L(L, 7);
return 0;
}追问

为什么构建链表的时候要反序呢

追答

这个有什么问题吗?始终要保证头指针不变啊,其实无所谓的

第4个回答  2011-11-09
参考:http://apps.hi.baidu.com/share/detail/20920723本回答被提问者采纳
相似回答