数据结构——单链表的基本

数据结构——单链表


链式存储是最常用的动态存储方法,为了克服顺序表的缺点,可以采用链式方式存储线性表。通常将采用链式存储结构的线性表称为线性链表。
(写的不好希望大家多多指教,欢迎指出错误)


定义

typedef struct Node {//单链表的定义
 int data;//数据域
 struct Node *next;//指针域
}Node,*LinkList;

对单链表进行初始化

LinkList *InitList(LinkList *L)//初始化单链表
{
 *L = (Node *)malloc(sizeof(Node));
 (*L)->next = NULL;
 return L;
}

这里采用的是尾插法对各个结点进行链接,这样输出的话是按顺序输出,而头插法则是逆序输出

void CreateFromTail(LinkList L)//尾插法建立单链表
{
 Node *s, *r;
 int i;
 r =(Node *) L;
 int flag = 1;
 while (flag)
 {
  scanf("%d", &i);
  if (i!=-1)
  {
   s = (Node *)malloc(sizeof(Node));
   s->data = i;
   r->next = s;
   r = s;
  }
  else
  {
   flag = 0;
   r->next = NULL;
  }
 }
}

只写了一个按序号查找元素,按值查找和这个思路差不多

int GetData(LinkList L, int i)//输入序号查找元素
{
 int j,num;
 Node *temp;
 temp = (Node *)L;
 for (j = 0; j < i; j++)
 {
  if (temp->next == NULL)
   printf("是空链表");
  temp = temp->next;
 }
 if (j == i)
  num = temp->data;
  return num;
}

在单链表中插入一个元素,单链表的插入和删除操作都需要对链表进行遍历

void insertlist(LinkList L, int i, int data)
{
 Node *p;
 Node *c;
 int j;
 p = (Node *)L;
 for (j = 1; j < i; j++)
 {
  if (p->next == NULL)
   printf("插入位置不合法\n");
  p = p->next;
 }
 if (i == j)
 {
  c = (Node *)malloc(sizeof(Node));
  c->data = data;
  c->next = p->next;
  p->next = c;
 }
}

输入需要删除结点所在的位置

void dellist(LinkList L, int i)//根据位置删除结点
{
 int j, num;
 Node *temp,*p;
 temp = (Node *)L;
 for (j = 0; j < i-1; j++)
 {
  if (temp->next == NULL)
   printf("是空链表");
  temp = temp->next;
 }
 p = temp->next;
 temp->next = p->next;
}

对两个链表,表A和表B进行合并并排序,同时释放表A和表B

Node  *MergeLinkList(LinkList LA, LinkList LB) 
{  
	 Node *pa, *pb, *r;
	 Node *LC = (Node *)malloc(sizeof(Node));
	 LC->next = NULL;
	 r = LC;
	 pa = (Node *)LA;
	 pb = (Node *)LB;
	 pa = pa->next;
	 pb = pb->next;
	 while (pa != NULL && pb != NULL)
	 {
	  if (pa->data <= pb->data)
	  {
	   r->next = pa;
	   r = pa;
	   pa = pa->next;
	  }
	  else
	  {
	   r->next = pb;
	   r = pb;
	   pb = pb->next;
	  }
	 }
	 if (pa)
	  r->next = pa;
	 if (pb) 
	  r->next = pb;
	 free(LA);
	 free(LB);
	 return LC;
	}

打印链表

void print(LinkList L)
{
 Node *p;
 p = L->next; 
 printf("单链表中的元素为:");
 while (p != NULL)
 {
  printf("%5d", p->data);
  p = p->next;
 }
 printf("\n");
}

验证

int main()
{
 LinkList list,LA,LB;
 int i,num,data;
 InitList(&list);
 printf("请输入数据,输入-1结束:\n");
 CreateFromTail(list);
 print(list);
 printf("请输入需要查找元素的位置:");
 scanf("%d", &i);
 num = GetData(list, i);
 printf("该位置的元素为:%d\n", num);
 printf("请输入需要插入的位置和元素:");
 scanf("%d%d", &i, &data);
 insertlist(list, i, data);
 print(list);
 printf("请输入需要删除元素的位置:");
 scanf("%d", &i);
 dellist(list, i);
 print(list);
 printf("请输入数据,输入-1结束:\n");
 InitList(&LA);
 CreateFromTail(LA);
 print(LA);
 printf("请输入数据,输入-1结束:\n");
 InitList(&LB);
 CreateFromTail(LB);
 print(LB);
 print(MergeLinkList(LA, LB));
 print(LA);
 print(LB);
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值