建表
1.顺序表建表
#include <stdio.h>
#define maxsize 100
int createList(int A[], int *length)
{
scanf("%d", length);
if(*length > maxsize)
return 0;
for(int i=0; i < *length; ++i)
{
scanf("%d",A++)
}
return 1;
}
2.链表建表
void createLinkList(LNode *head)
{
head = (LNode *)malloc(sizeof(LNode));
head->next = NULL;
LNode *p = NULL, *r = head;
int n;.
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
p = (LNode *)malloc(sizeof(LNode));
p->next = NULL;
scanf("%d", &(p->data));
p->next = r->next;
r->next = p;
r = p;
}
}
3.链表应用
键盘输入n个字母,存放入单链表中,字母不重复存入
void createlist(LNode *head)
{
head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
LNode *p;
int n;
char ch;
scanf("%d", &n);
for(i=0; i<n; ++i)
{
scanf("%s",&ch);
p = head->next;
//遍历链表看是否有相同字母
while(p != NULL)
{
if( p->data == ch)
break;
p = p->next;
}
if(p != NULL)
{
p = (LNode*)malloc(sizeof(LNode));
p->data = ch;
p->next = head->next;
head->next = p;
}
}
}
4.顺序表前k个字母逆置
void reverse(int a[], int left, int right, int k)
{
int temp;
for(int i = left, j = right; i<left+k && i<j; ++i, --j)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
//头尾对应位置互换
}
}
将数组中元素前p个元素和后p个元素保持原序,互换位置
void movep(int a[], int n, int p)
{
reverse(a,0,p-1;p);
reverse(a,p,n-1;n-p);
//前后p个元素分别逆置
reverse(a,0,n-1;n);
}
5.在线性表中取最值
int maxx(int a[], int n)
{
int max = a[0];
int maxidx = 0;
for(int i = 0; i < n; ++i)
{
if(max < a[i])
{
max = a[i];
maxidx = i;
}
}
return maxidx;
}
int minn(int a[], int n)
{
int min = a[0];
int minidx = 0;
for(int i = 0; i < n; ++i)
{
if(min > a[i])
{
min = a[i];
minidx = i;
}
}
return minidx;
}
6.在线性表中取最值
已知链表头结点head
//取最大值
LNode *p,*q;
int max = head->next->data;
p = q =head->next;
while(p != NULL)
{
if(max < p->data)
{
max = p->data;
q=p;
}
p = p->next;
}
//取最小值
LNode *p,*q;
int min = head->next->data;
p = q =head->next;
while(p != NULL)
{
if(min > p->data)
{
min = p->data;
q=p;
}
p = p->next;
}
链表找最值
void maxFirst(DLnode *head)
{
DLnode *p = head->rlink, *q = p;
int max = p->data;
while(p != NULL)
{
if(max < p->data)
{
max = p->data;
q = p;
}
p = p->rlink;
}
//删除
DLnode *l = q->llink, *r = q->rlink;
l->rlink = r;
if(r != NULL)//判断r是否为空
r->llink = l;
//插入
q->llink = head;
q->rlink = head->rlink;
head->rlink = q;
q->rlink->llink = q;
}
7.题目应用
想法:
LNode *findFirstCommon(LNode *str1, LNode *str2)
{
int len1 = 0, len2 = 0;
LNode *p = str1->next, *q = str2->next;
while(p!=NULL)
{
len1++;
p = p->next;
}
while(q!=NULL)
{
len2++;
q = q->next;
}
for(p=str1->next; len1>len2; len1--)
p = p->next;
for(q=str2->next; len1<len2; len2--)
p = p->next;
while(p!=NULL && p!=q)
{
p = p->next;
q = q->next;
}
return p;
}
8.划分
想法一:找出枢轴,根据 i,j 关系比较,依次左移右移;当i=j时,将temp存入,划分结束
void partition(int a[], int n, int comp)
{
int temp;
int i=0, j = n - 1;
temp = a[i];
while(i<j)
{
while(i<j && arr[j] >= comp) --j;
if(i<j)
{
arr[i] = arr[j];
i++;
}
while(i<j && arr[i] < comp) ++i;
if( i < j)
{
arr[i] = arr[i];
--j;
}
}
arr[i] = temp;
}
9.将带头结点的单链表L逆置
//将L头结点断开,将其中元素依次插入到L表中
void reverse(LNode *L)
{
LNode *p=L->next, *q;
L->next=NULL;
while(p!=NULL)
{
q = p->next;
p->next = L->next;
L->next=p;
p=q;
}
}
10.逆序打印表中数据
//类似递归
void reprint(LNode *L)
{
if(L!=NULL)
{
reprint(L->next);
printf("%d",L->data);
}
}
11.合并顺序表表
void mergeList(int a[],int m,int b[], int n, int c[])
{
int i=0,j=0;
int k=0;
while(i<m && j<n)
{
if(a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i<m)
c[k++]=a[i++];
while(j<n)
c[k++]=b[j++];
}
12.合并顺链表
void mergeList(LNode *l1,LNode *l2,LNode *c)
{
LNode *p=l1->next, *q = l2->next,*r = c;
while(p!=NULL && q!=NULL)
{
if(p->data < q->data)
{
r->next = p;
r = p;
p = p->next;
}
else
{
r->next = q;
r = q;
q = q->next;
}
}
if(p == NULL)
r->next = q;
if(q == NULL)
r->next = p;
}
若要得到逆序链表,则将 l1,、l2链表比较后依次插入C中