初始化建立链表的两种方法

方法一是把头指针作为函数参数

方法二是在函数中建立好链表后,然后返回这个链表


#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef int ElemType;

typedef struct Node{  //创建双向链表的结点 

	int data;

	struct Node *next;

}DLinkList;

void InitList(DLinkList *&head,int n)   //方法一 

{

	DLinkList *p,*s;

	head=(DLinkList*)malloc(sizeof(DLinkList));

	head->next=NULL;

	p=head;

	for(int i=1;i<=n;i++)

	{

		s=(DLinkList*)malloc(sizeof(DLinkList));

		scanf("%d",&s->data);

		s->next=NULL;

		p->next=s;

		p=p->next;

	}

} 

/*DLinkList *InitList(int n){        方法二 

	DLinkList *head,*p,*s;

	head=(DLinkList*)malloc(sizeof(DLinkList));

	head->next=NULL;

	p=head;

	for(int i=1;i<=n;i++)

	{

		s=(DLinkList*)malloc(sizeof(DLinkList));

		scanf("%d",&s->data);

		s->next=NULL;

		p->next=s;

		p=p->next;

	}

	return head;

}*/
void print(DLinkList *head)     //输出双向链表的所有的元素 

{

	DLinkList *p;

	p=head->next;

	while(p!=NULL)

	{

		printf("%d ",p->data);

		p=p->next;

	}

}

int main()

{

	DLinkList *head;

	InitList(head,5);

	print(head); 

/*  DLinkList *head;

    head=InitList(5);

	print(head);*/

	return 0; 

} 




 

 

 

 

 

  • 18
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node{ int data; // 数据域 struct Node* next; // 指针域 }Node, *LinkedList; // 函数声明 void initList(LinkedList* L); // 链表初始化 void createListF(LinkedList* L); // 头插法建立链表 void createListR(LinkedList* L); // 尾插法建立链表 Node* findNode(LinkedList L, int x); // 按值查找节点 void traverseList(LinkedList L); // 遍历链表 void insertNode(LinkedList L, int x, int i); // 插入节点到指定位置 void deleteNode(LinkedList L, int x); // 删除节点 void mergeList(LinkedList* La, LinkedList* Lb, LinkedList* Lc); // 合并两个有序链表 int main(){ LinkedList La, Lb, Lc; printf("初始化链表A...\n"); initList(&La); printf("初始化链表B...\n"); initList(&Lb); printf("请按头插法输入链表A的元素(以0作为结束标志):"); createListF(&La); printf("请按尾插法输入链表B的元素(以0作为结束标志):"); createListR(&Lb); printf("链表A的元素为:"); traverseList(La); printf("链表B的元素为:"); traverseList(Lb); int x; printf("请输入要查找的值:"); scanf("%d", &x); Node* p = findNode(La, x); if(p) printf("链表A中值为%d的节点在第%d个位置。\n", x, (int)(p - La)); else printf("链表A中不存在值为%d的节点。\n", x); int a; printf("请输入要插入的值:"); scanf("%d", &a); int i; printf("请输入要插入的位置:"); scanf("%d", &i); insertNode(La, a, i); printf("插入后的链表A为:"); traverseList(La); int b; printf("请输入要删除的值:"); scanf("%d", &b); deleteNode(La, b); printf("删除后的链表A为:"); traverseList(La); mergeList(&La, &Lb, &Lc); printf("合并后的链表C为:"); traverseList(Lc); return 0; } // 初始化链表 void initList(LinkedList* L){ // 创建头结点 *L = (LinkedList)malloc(sizeof(Node)); (*L)->next = NULL; } // 头插法建立链表 void createListF(LinkedList* L){ int x; scanf("%d", &x); while(x){ Node* p = (Node*)malloc(sizeof(Node)); p->data = x; p->next = (*L)->next; (*L)->next = p; scanf("%d", &x); } } // 尾插法建立链表 void createListR(LinkedList* L){ int x; Node* tail = *L; scanf("%d", &x); while(x){ Node* p = (Node*)malloc(sizeof(Node)); p->data = x; p->next = NULL; tail->next = p; tail = p; scanf("%d", &x); } } // 按值查找节点 Node* findNode(LinkedList L, int x){ Node* p = L->next; while(p){ if(p->data == x) return p; p = p->next; } return NULL; } // 遍历链表 void traverseList(LinkedList L){ Node* p = L->next; while(p){ printf("%d ", p->data); p = p->next; } printf("\n"); } // 插入节点到指定位置 void insertNode(LinkedList L, int x, int i){ Node* p = L; int j = 0; while(p && j < i - 1){ p = p->next; j++; } if(!p || j > i - 1){ printf("插入位置错误!\n"); return; } Node* node = (Node*)malloc(sizeof(Node)); node->data = x; node->next = p->next; p->next = node; } // 删除节点 void deleteNode(LinkedList L, int x){ Node* p = L; while(p->next){ if(p->next->data == x){ Node* node = p->next; p->next = node->next; free(node); return; } p = p->next; } printf("未找到要删除的节点!\n"); } // 合并两个有序链表 void mergeList(LinkedList* La, LinkedList* Lb, LinkedList* Lc){ Node* pa = (*La)->next; Node* pb = (*Lb)->next; Node* pc = (*Lc) = (*La); // 合并后的链表C共用链表A的头结点 while(pa && pb){ if(pa->data <= pb->data){ pc->next = pa; pa = pa->next; } else{ pc->next = pb; pb = pb->next; } pc = pc->next; } if(pa) pc->next = pa; if(pb) pc->next = pb; } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值