今天接着学习了链表的循环链表和双链表,发现链表要处理的小细节真的太多了。
另外跟着学长学了dfs和bfs、快排。
总的来说(上午双链表,循环链表;下午dfs,bfs,快排)
晚上就写了一个双链表操作的题。链表真是让我摸不着头脑
1514: 合并链表(线性表)
时间限制:1s
内存限制:128MB
题目描述
(线性表)假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
输入格式
输入长度n:5
输入数据:1 2 5 6 8
输入长度m:5
输入数据:3 4 7 9 10
输出格式
10 9 8 7 6 5 4 3 2 1
样例输入content_copy
4
7 9 10 11
4
8 12 13 14
样例输出content_copy
14 13 12 11 10 9 8 7
思路:就是按题目的要求做就行了
#include<stdio.h>
typedef struct DOUBLE_LIST
{
int data;
struct DOUBLE_LIST *front;
struct DOUBLE_LIST *next;
}double_list;
double_list *createlist() //创建有n个元素的双向链表 并输入元素
{
double_list *head, *p, *q;
int n,x;
head = (double_list *)malloc(sizeof(double_list));
head->front = head;
head->next = head;
p = head;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d", &x);
q = (double_list *)malloc(sizeof(double_list));
q->data = x;
p->next = q;
head->front = q;
q->front = p;
q->next = head;
p = q;
}
return head;
}
//遍历并且输出这些元素
void printlist(double_list *head)
{
double_list *p,*q;
p = head;
p = p->next;
int k;
scanf("%d",&k);
k--;
while(k--)
p=p->next;
q=p->front;
while(p!=q)
{
if(p==head)
{
p=p->next;
continue;
}
printf("%d ",p->data);
p=p->next;
}
printf("%d \n",p->data);
}
//在第i个元素之前插入数据data
void insertlist_f(double_list *head, int i, int data)
{
double_list *p = head, *q;
p = p->next;
i--;
while(i--)
p = p->next;
q = (double_list *)malloc(sizeof(double_list));
q->data = data;
(p->front)->next = q;
q->front = p->front;
q->next = p;
p->front = q;
}
//删除第i个位置的元素
void del(double_list *head, int i)
{
double_list *p = head;
p = p->next;
i--;
while(i--)
p = p->next;
(p->front)->next = p->next;
(p->next)->front = p->front;
free(p);
}
int main()
{
double_list *head;
head = createlist();
int m;
scanf("%d",&m);
if(m>0)
del(head,m);
int n,k;
scanf("%d%d",&n,&k);
insertlist_f(head,n,k);
printlist(head);
return 0;
}
明天把欠着的题补上然后尽量写几个搜索吧