typedef struct Node {
ElemType data;
struct Node *next;
} Node,*Linklist;
LinkLIst L;
LinkList 與 Node*同爲結構指針類斜體樣式型,這兩種類型是等價的。
通常我們習慣上用LinkList說明指針變量,強調它是某個單鏈表的頭指針變量,用
Node*來定義指向單鏈表中節點的指針。
int listlength(linklist L){
node *p;
p=->next;
j=0;
while(p!=NULL){
p=p->next;
j++;
}
return j;
}
InitList(linklist *L){
L=(linklist*)malloc(sizeof(node));
L->next=NULL;
}
linklist creatfromhead(linklist l){
node *s;
char c;
int flag=1;
while(flag){
c=getchar();
if(c!='$'){
s(node*)malloc(sizeof(node))
s->data=c;
s->next=L->next;
L->next=s;
}
else flag=0;
}
}
linklist createfromtail(linklist L){
linklist L;
node *r,*s;
char c;
int flag=1;
r=L;
while(flag){
c=getchar();
if(c!='$'){
s=(node*)malloc(sizeof(node));
s->data=c;
r->next=s;
r=s;
}
else{
flag=0;
r->next=NULL;
}
}
}
node *get(linklist L,int i)
{
int j=0;
node *p;
p=L;
while((p->next!=NULL)&&(j<i)){
p=p->next;
j++;
}
if(i==j)return p;
else return NULL;
}
node *locate(linklist l,elemtype key)
{
node *p;
p=l->next;
while(p!=NULL){
if(p->data!=key)
p=p->next;
else break;
}
return p;
}
void inslist(linklist L,int i,elemtype e){
node *pre,*s;
int k=0;
pre=L;
while(pre!=NULL&&k<(i-1))
{
pre=pre->next;
k++;
}
if(!pre)
{
printf("插入位置不合理");
return ERROR;
}
s=(node*)malloc(sizeof(node));
s->data=e;
s->next=pre->next;
pre->next=s;
return OK;
}
void dellist(linklist L,int i,elemtype *e)
{
node *p,*r;
int k=0;
p=L;
while(p->next!=NULL&&k<(i-1))
{
p=p->next;
k++;
}
if(k!=i-1)
{
printf("刪除位置i不合理");
return error;
}
r=p->next;
p->next=p->next->next;
*e=r->data;
free(r);
}
void difference(linklist la,linklist lb) {
node *pre,*p,*q,*r;
pre=la;
p=la->next;
while(p!=NULL) {
q=lb->next;
while(q!=NULL&&q->data!=p->data) {
q=q>next;
}
if(q!=NULL) {
r=p;
pre->next=p->next;
p=p->next;
free(r);
} else {
pre=p;
p=p->next;
}
}
}
【問題分析】逆置就是使得表中內容由原來的(a1,a2,…,ai-1,ai,ai+1, …,an)變爲
(an,an-1,…,ai+1,ai,ai-1, …,a1)。就地逆置就是不需要額外申請結點空間,只需要
利用原有的表中的節點空間。若對順序表中的元素進行逆置,可以藉助於“交換”前後相應
元素;對單鏈表中的元素進行逆置,則不能按“交換”思路,因爲對於鏈表中第 i 個結點需
要順鏈查找第 n-i+1(鏈表長度爲 n)個結點,逆置鏈表的時間複雜度將達 O(n2)。
【算法思路】用頭插法完成
- 【初始化】逆置鏈表L初始爲空表,指針p指向原表當前處理結點
- 【頭插法】依次取原鏈表中當前結點p
將其作爲第一個結點插入到逆置鏈表L的表頭L
q爲保存原鏈表當前結點的下一個處理位置
【算法描述】
void reverselist(linklist l)
{
p=l->next;
l->next=NULL;
while(p!=NULL){
q=p->next;
p->next=l->next;
l->next=p;
p=q;
}
}
建立一個帶頭結點的線性鏈表,用以存放輸入的二進制數,鏈表中每個結點的
data 域存放一個二進制位。並在此鏈表上實現對二進制數加 1 的運算
【問題分析】
①建鏈表:帶二進制數可用帶頭結點的單鏈表存儲,第一個結點存儲二進制數的最高位,依次存儲,最後一個結點存儲二進制數的最低位。
②二進制加法規則:實現二進制數加 1 運算,方向從低位往高位找到第一個值爲 0 的位,把該位改成1,其後所有各位改成0
③鏈表實現二進制加 1 時,從高位往低位與運算方向正好相反,從第一個結點開始找,找出最後一個值域爲 0 的結點,把該結點值域賦爲 1,其後所有結點的值域賦爲 0。
④若在鏈表中未找到值域爲 0 的結點,則表示該二進制數各位均爲 1,此時,申請一新結點,值域爲 1,插入到頭結點與原鏈表的第一個結點之間,成爲新鏈表的第一個結點,其後所有結點的值域賦爲 0。
【算法描述】
void binadd(linklist l) {
node *q,*r,*s;
q=l->next;
r=l;
while(q!=NULL)
{
if(q->data==0) r=q;
q=q->nest;
}
if(r!=l)
{
r->data=1;
} else
{
s=(node*)malloc(sizeof(node));
s->data=1;
s->next=l->nest;
l->nest=s;
r=s;
}
r=r->nest;
while(r!=NULL)
{
r->data=0;
r=r->nest;
}
}